如何在使用gson转换器时将改装用作单件?

Ast*_*hme 15 java rest android gson retrofit

从@jake Wharton的回答中,您应该只调用一次restAdapter.create,并在每次需要进行交互时重复使用相同的MyTaskService实例.我不能强调这一点.您可以使用常规单例模式,以确保在任何地方只使用这些对象的单个实例.依赖注入框架也可用于管理这些实例,但如果您尚未使用它,则会有点矫枉过正.

这是我的代码

public class MusicApi {
private static final String API_URL = "https://itunes.apple.com";
private static MusicApiInterface sMusicApiInterface;

public static MusicApiInterface getApi() {
    if (sMusicApiInterface == null) {
        sMusicApiInterface = null;
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(API_URL)
                .build();

        sMusicApiInterface = restAdapter.create(MusicApiInterface.class);
    }
    return sMusicApiInterface;
}

public interface MusicApiInterface {
    @GET("/search?entity=musicVideo")
    NetworkResponse getMusic(@Query("term") String term);

    @GET("/search?entity=musicVideo")
    void getMusic(@Query("term") String term, Callback<NetworkResponse> networkResponseCallback);

    @GET("/search?entity=musicVideo")
    Observable<NetworkResponse> getMusicObservable(@Query("term") String term);
}
Run Code Online (Sandbox Code Playgroud)

}

一切正常.我正在使用类型适配器,对于每个请求,我需要创建不同类型的gson解析并设置为适配器.

Gson gson = new GsonBuilder().registerTypeAdapter(DiscussionViewMoreContainer.class, new ExplorerDeserializerJson())
            .create();
Run Code Online (Sandbox Code Playgroud)

它让我每次都要创造一个新的restadapter.在我的应用程序中,一些请求并行运行.这是正确的方法吗?

Bla*_*elt 11

您不必每次都创建它,但只需创建一次RestAdapter:

public static MusicApiInterface getApi() {
    if (sMusicApiInterface == null) {
       Gson gson = new GsonBuilder()
           .registerTypeAdapter(DiscussionViewMoreContainer.class, new ExplorerDeserializerJson())
           .create();
       RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(API_URL)
            .setConverter(new GsonConverter(gson))
            .build();
       sMusicApiInterface = restAdapter.create(MusicApiInterface.class);
     }
     return sMusicApiInterface;
}
Run Code Online (Sandbox Code Playgroud)

如果您需要注册多个Deserializer,请致电.registerTypeAdapter多次使用Class/TypeToken自定义对和实例Deserializer.Gson会调用正确的一个,具体取决于您调用的改装方法的返回类型.例如

Gson gson = new GsonBuilder()
           .registerTypeAdapter(DiscussionViewMoreContainer.class, new ExplorerDeserializerJson())
           .registerTypeAdapter(OtherModelClass.class, new OtherModelClassDeserializerJson())
           .registerTypeAdapter(OtherModelClass3.class, new OtherModelClass3DeserializerJson())
Run Code Online (Sandbox Code Playgroud)

  • 你可以多次调用`registerTypeAdapter`. (2认同)