Как использовать retrofit как синглтон при использовании конвертора gson?
из ответа @jake Wharton вы должны только когда-либо вызывать restAdapter.создайте один раз и повторно используйте один и тот же экземпляр 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();
это заставляет меня, что я должен создать новый restadapter каждый раз. В моем приложении некоторые запросы выполняются параллельно.это правильный путь?
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())