2015-06-17 11 views
10

Mi stavo chiedendo se ci saranno dei colli di bottiglia nelle prestazioni o problemi se creo un'istanza di OkHttpClient per servire la mia "intera applicazione Android". Nella mia classe Application, creo una variabile pubblica statica che conterrà un'istanza di OkHttpClient e ogni volta che devo fare una richiesta http, fondamentalmente costruisco un oggetto request, quindi utilizzo l'istanza okhttpclient creata per attivare la richiesta.okhttp application level OkHttpClient instance

codice per essere come questo

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

risposta

17

Utilizzando singola istanza non è un problema, invece è una pratica migliore. Puoi controllare un'app simile da github che usa dagger per rendere singleton OkHttpClient e inietta altri moduli.

E si può vedere in this discussion JakeWharton suggerisce anche questo tipo di utilizzo.

Ma è meglio se si utilizza un Pattern Singleton per questo scopo.

+1

Grazie a @bhdrkn. Ho visto sia la discussione che lo stile singleton e credo che lo farò. –

+0

Nota: la singola istanza non è la stessa di singleton https://www.thekua.com/atwork/2009/01/singleton-vs-single-instance/. –

+1

Se ho più domini, dovrei usare un'istanza okhttp per dominio, giusto? –

0

parte quanto @bhdrkn suggerisce correttamente, per confermare definitivamente che un'istanza Singleton OkHttpClient è un modo corretto di andare, un estratto dalla documentazione:

Fonte: https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html

OkHttpClients dovrebbe essere condiviso

OkHttp si comporta meglio quando si crea una singola istanza di OkHttpClient e riutilizzata per tutte le chiamate HTTP. Questo perché ogni client mantiene il proprio pool di connessione e pool di thread. Riutilizzare connessioni e thread riduce la latenza e salva la memoria. Al contrario, la creazione di un client per ogni richiesta spreca risorse su pool inattivi.

Fare riferimento a Javadoc (collegamento sopra) per vedere i modi corretti di inizializzazione dell'istanza OkHttpClient.