2015-06-17 12 views
10

Zastanawiam się, czy nie będzie żadnych wąskich gardeł wydajności lub problemów, jeśli utworzyć jedną instancję OkHttpClient do obsługi mojej "całej aplikacji Android". W mojej klasie aplikacji tworzę statyczną zmienną publiczną, która będzie zawierała instancję OkHttpClient, a gdy zajdzie potrzeba wykonania żądania http, generuję po prostu obiekt żądania, a następnie używam utworzonej instancji okhttpclient do odpalenia żądania.poziom aplikacji okhttp instancja OkHttpClient

Code tak być

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

Odpowiedz

17

Korzystanie jedno wystąpienie nie jest problemem, a nie jest to najlepsza praktyka. Możesz sprawdzić podobną aplikację od github, która używa sztyletu do tworzenia singleton OkHttpClient i wstrzykuje mu inne moduły.

I widać, że in this discussion JakeWharton również sugeruje tego rodzaju użycie.

Ale lepiej jest użyć do tego celu wzoru Singleton.

+1

Dzięki @bhdrkn. Widziałem zarówno dyskusję, jak i styl singletonowy i myślę, że pójdę po to. –

+0

Uwaga: pojedyncza instancja to nie to samo co singleton https://www.thekua.com/atwork/2009/01/singleton-vs-single-instance/. –

+1

Jeśli mam wiele domen, powinienem użyć instancji okhttp na domenę, prawda? –

0

Oprócz co @bhdrkn słusznie sugeruje, aby zdecydowanie potwierdzić, że pojedyncza instancja OkHttpClient jest prawidłowa droga, wyciąg z dokumentacji:

Źródło: https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html

OkHttpClients powinny być udostępniony

OkHttp działa najlepiej, gdy tworzysz pojedynczą instancję OkHttpClient i używasz jej ponownie do wszystkich połączeń HTTP. Dzieje się tak, ponieważ każdy klient przechowuje własną pulę połączeń i pule wątków. Ponowne użycie połączeń i wątków zmniejsza opóźnienia i oszczędza pamięć. Odwrotnie, tworzenie klienta dla każdego żądania powoduje marnowanie zasobów w pulach bezczynności.

Zobacz Javadoc (link powyżej), aby zobaczyć prawidłowe sposoby inicjowania instancji OkHttpClient.

Powiązane problemy