Я обычно создавала 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);
}
}
Создаю ретрофит в 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() дергаю на каждый запрос, т.е. потецниально ретрофит может создаваться каждый раз, на каждый запрос
Вы все правильно делаете, в Application
ему самое место, но я бы не советовал хранить состояние в static переменных, есть разные мнения по этому поводу. Также я бы посоветовал использовать dagger для этих целей.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Я хочу создать абстрактный класс BaseActivity, от которого бы наследовались остальные Activity в проекте, во всех классах Activity у меня сейчас используется...
Во время нажатия на EditText появляется клавиатура, но когда открываем NavigationDrawer то она никуда не пропадает и даже если перейдем на другой фрагмент...
Есть текставик содержащий луа скрипты и ненужный мусорНужно выводить куски текста скажем от "local" до "}" по нажатию кнопки