Как использовать модификацию в качестве синглета при использовании gson-преобразователя?

Из ответа @jake Wharton вы должны только когда-либо вызвать restAdapter.create один раз и повторно использовать тот же экземпляр MyTaskService каждый раз, когда вам нужно взаимодействовать. Я не могу подчеркнуть это достаточно. Вы можете использовать обычный шаблон singleton, чтобы гарантировать, что только один экземпляр этих объектов используется повсюду. Рамка внедрения зависимостей также была бы чем-то, что можно было бы использовать для управления этими экземплярами, но было бы чересчур избыточным, если вы еще не используете его.

это мой код

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);
}

}

Все работает отлично. Я использую адаптер типа. Для каждого запроса мне нужно создать разный тип gson-анализа и настройку в адаптер.

Gson gson = new GsonBuilder().registerTypeAdapter(DiscussionViewMoreContainer.class, new ExplorerDeserializerJson())
            .create();

это делает меня тем, что мне приходится каждый раз создавать новый релаксатор. В моем приложении некоторые запросы выполняются параллельно. Это правильный способ?

Ответы

Ответ 1

вам не нужно создавать его каждый раз, но только один раз, когда вы создаете 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;
}

если вам нужно зарегистрировать более одного 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())