Где лучше создавать Retrofit клиент?

327
26 ноября 2016, 19:12

Я обычно создавала Retrofit клиент в классе App в onCreate(), но услышала мнение, что это неправильно, так как по сути получается, что это не Синглтон. Где и как лучше создавать Retrofit клиент?

Мой пример кода:

public class App extends Application {
    public static MessengerApi service;
    private static OkHttpClient client;
    private static Retrofit retrofit;
    @Override
    public void onCreate() {
        super.onCreate();
        HeaderInterceptor headerInterceptor = new HeaderInterceptor();
        HttpLoggingInterceptor logger = new HttpLoggingInterceptor();
        logger.setLevel(HttpLoggingInterceptor.Level.BODY);
        client = new OkHttpClient.Builder()
                .connectTimeout(60, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .addInterceptor(logger)
                .addInterceptor(headerInterceptor)
                .build();
        retrofit = new Retrofit.Builder()
                .baseUrl(BuildConfig.BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        service = retrofit.create(MessengerApi.class);
    }
}
Answer 1

Создаю ретрофит в BaseApiManager

  public BaseApiManager(final String baseUrl) {
    final Context ctx = IsoverApplication.getInstance();
    mMainHandler = new WeakHandler(ctx.getMainLooper());
    final HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    final OkHttpClient.Builder builder = new OkHttpClient.Builder().addInterceptor(new BasicAuthInterceptor("isover", "isover2016"))
                                                                   .cookieJar(new MemoryCookieJar())
                                                                   .addInterceptor(new EmptyBodyToJsonInterceptor())
                                                                   .addNetworkInterceptor(interceptor);
    builder.cache(new Cache(ctx.getCacheDir(), SIZE_OF_CACHE))
           .interceptors()
           .addAll(getAdditionalInterceptors());
    mClient = builder.build();
    mRetrofit = new Retrofit.Builder().baseUrl(baseUrl)
                                      .client(mClient)
                                      .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                                      .addConverterFactory(new ToStringConverterFactory())
                                      .addConverterFactory(createConverterFactory())
                                      .callbackExecutor(Executors.newCachedThreadPool())
                                      .build();
  }

,

который является синглтоном

  public static BaseApiManager getInstance() {
    if (sInstance == null) {
      sInstance = new BaseApiManager();
    }
    return sInstance;
  }

getInstance() дергаю на каждый запрос, т.е. потецниально ретрофит может создаваться каждый раз, на каждый запрос

Answer 2

Вы все правильно делаете, в Application ему самое место, но я бы не советовал хранить состояние в static переменных, есть разные мнения по этому поводу. Также я бы посоветовал использовать dagger для этих целей.

READ ALSO
Абстрактный класс BaseActivity

Абстрактный класс BaseActivity

Я хочу создать абстрактный класс BaseActivity, от которого бы наследовались остальные Activity в проекте, во всех классах Activity у меня сейчас используется...

204
NavigationDrawer и клавиатура

NavigationDrawer и клавиатура

Во время нажатия на EditText появляется клавиатура, но когда открываем NavigationDrawer то она никуда не пропадает и даже если перейдем на другой фрагмент...

303
Как вывести часть текста из файла?

Как вывести часть текста из файла?

Есть текставик содержащий луа скрипты и ненужный мусорНужно выводить куски текста скажем от "local" до "}" по нажатию кнопки

220