Экземпляр 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.