2015-06-17 4 views
10

Мне было интересно, будет ли какое-либо узкое место или проблемы с производительностью, если я создам один экземпляр OkHttpClient для обслуживания моего «всего приложения Android». I.e. В моем классе Application я создаю статическую общедоступную переменную, которая будет содержать экземпляр OkHttpClient, и всякий раз, когда мне нужно выполнить HTTP-запрос, я в основном создаю объект запроса, а затем создаю экземпляр okhttpclient для запуска запроса.ohttp application level OkHttpClient instance

Код быть, как это

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(); 

ответ

17

Использование одного экземпляра не проблема, а не это лучшая практика. Вы можете проверить аналогичное приложение от github, которое использует кинжал, чтобы сделать SingleHonline OkHttpClient и вводить его в другие модули.

И вы можете видеть in this discussion JakeWharton также предлагает этот вид использования.

Но лучше использовать шаблон Singleton для этой цели.

+1

Thanks @bhdrkn. Я видел как обсуждение, так и стиль синглтона, и я думаю, что поеду за ним. –

+0

Обратите внимание: один экземпляр не совпадает с singleton https://www.thekua.com/atwork/2009/01/singleton-vs-single-instance/. –

+1

В случае, если у меня есть несколько доменов, я должен использовать экземпляр okhttp для домена, не так ли? –

0

Помимо того, что @bhdrkn правильно предполагает, чтобы определенно подтвердить, что синглтон экземпляр OkHttpClient является правильным способом пойти, выдержка из документации:

Источник: https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html

OkHttpClients должен быть shared

OkHttp лучше всего работает, когда вы создаете один экземпляр OkHttpClient и повторно используете его для всех ваших HTTP-вызовов. Это связано с тем, что каждый клиент имеет собственный пул подключений и пулы потоков. Повторное использование соединений и потоков уменьшает задержку и экономит память. И наоборот, создание клиента для каждого запроса тратит ресурсы на пулы бездействия.

См. Javadoc (ссылка выше), чтобы увидеть правильные способы инициализации экземпляра OkHttpClient.

Смежные вопросы