Экземпляр OkhttpClient для прикладного уровня okhttp
Мне было интересно, будет ли какое-либо узкое место в производительности или проблемы, если я создам один экземпляр OkHttpClient для обслуживания моего "всего приложения для Android". I.e. В моем классе Application я создаю статическую общедоступную переменную, которая будет содержать экземпляр OkHttpClient, и всякий раз, когда мне нужно выполнить HTTP-запрос, я в основном создаю объект запроса, а затем создаю экземпляр okhttpclient для запуска запроса.
Код должен выглядеть следующим образом
public class MyApplication extends Application {
public static OkHttpClient httpClient;
@Override
public void onCreate() {
super.onCreate();
httpClient = new OkHttpClient();
}
}
// Making request 1
Request request1 = new Request.Builder().url(ENDPOINT).build();
Response response = MyApplication.httpClient.newCall(request1).execute();
// Making request 2
Request request2 = new Request.Builder().url(ENDPOINT).build();
Response response = MyApplication.httpClient.newCall(request2).execute();
Ответы
Ответ 1
Использование одного экземпляра не является проблемой, а является лучшей практикой. Вы можете проверить похожее приложение на github, которое использует кинжал для создания синглтона OkHttpClient и внедряет его в другие модули.
И вы можете видеть в этом обсуждении, Джейк Уортон также предлагает этот вид использования.
Но для этой цели лучше использовать шаблон Singleton.
Ответ 2
Кроме того, что правильно предлагает @bhdrkn, определенно подтвердить, что один экземпляр OkHttpClient
является правильным способом, выдержка из документации:
Источник: https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html
OkHttpClients следует использовать
OkHttp лучше всего работает, когда вы создаете один экземпляр OkHttpClient и повторно используете его для всех ваших HTTP-вызовов. Это связано с тем, что каждый клиент имеет собственный пул подключений и пулы потоков. Повторное использование соединений и потоков уменьшает задержку и экономит память. И наоборот, создание клиента для каждого запроса тратит ресурсы на пулы бездействия.
Обратитесь к Javadoc (ссылка выше), чтобы увидеть правильные способы инициализации экземпляра OkHttpClient
.