2015-01-15 42 views
10

Sto usando la libreria Volley nella mia app per Android. Funziona bene, ma ho visto che OkHttp offre anche altri miglioramenti. Ho integrato l'OkHttp con Volley utilizza:Devo usare OkHttp con la libreria Volley?

Volley.newRequestQueue(mCtx.getApplicationContext(), new OkHttpStack()); 

La mia classe è OkHttpStack:

public class OkHttpStack extends HurlStack { 
    private final OkUrlFactory mFactory; 

    public OkHttpStack() { 
     this(new OkHttpClient()); 
    } 

    public OkHttpStack(OkHttpClient client) { 
     if (client == null) { 
      throw new NullPointerException("Client must not be null."); 
     } 
     mFactory = new OkUrlFactory(client); 
    } 

    @Override protected HttpURLConnection createConnection(URL url) throws IOException { 
     return mFactory.open(url); 
    } 
} 

1) Ne vale la pena? Non ho notato alcun miglioramento evidente, ma potrebbe essere perché non ho ancora implementato il supporto SPDY sul mio server.

2) Sul miglioramento di OkHttp è la cache di risposta. Tuttavia, anche il volley lo fa. Avrò problemi simili a questo: https://github.com/square/okhttp/issues/680

3) Inoltre, sto usando due RequestQueues in Volley - uno per immagini & altro per JSON. Dovrei usare OkHttp con entrambe le code?

risposta

3

Non so.

Ma io sono in una posizione simile e sto scendendo dalla parte di "no, non per ora". Tuttavia, ho alcune idee: elaborerò:

Non ho trovato alcun reale vantaggio nell'usare OkHttp sotto Volley per il mio uso. (I server HTTPS a cui mi collego non supportano SPDY, e so che sto già ottenendo il pooling di connessioni e credo anche alla codifica gzip, e so che Volley ha una cache funzionante.) E aggiunge altre centinaia di K a l'app che può solo danneggiare le prestazioni, credo.

Ciò che OkHttp ha, che Volley potrebbe essere modificato per utilizzare, è la vera interruzione della connessione. Questo è ciò che mi interessa di più, perché la mia app fa molte richieste e annulla anche molte di esse. In questo momento Volley non interrompe in realtà una richiesta che ha reso possibile l'apertura di una connessione (o meno), segna solo la cancellazione e getta via la risposta del server.

Questo va bene per la semantica, ma ha implicazioni di prestazioni gravi nel mio caso. Specificamente, se faccio un sacco di richieste a un server morente, e quelle richieste andranno a timeout, a Volley occorreranno qualcosa come 30 secondi ciascuno per volta, durante le quali altre richieste in coda non saranno in grado di utilizzare connessione di rete perché il pool è occupato in attesa di timeout delle connessioni.

Quindi quello che sto pensando è che sarebbe bello scrivere un "OkHttpStack" e scandagliare l'evento #cancel() su OkHttp e in realtà interrompere la connessione, sarebbe una grande vittoria per me.

FWIW, sui telefoni Android 4.4 Ho visto che tutti usano l'implementazione OkHttp di HTTPUrlConnection, e si ottiene che 'gratuitamente' si muova in avanti.

+0

In realtà c'è un vantaggio. Se si utilizza Volley per impostazione predefinita, non è possibile imporlo per utilizzare TLS per impostazione predefinita su Android 4.3 e versioni successive. Se utilizzi OkHttp come stack personalizzato, puoi applicarlo. –

8

vi consiglio di passare a uno stack che non utilizza okhttp-URLConnection come questo - la larghezza di banda>https://goo.gl/ZZRSQ5

1) Sì OkHttp ha un sacco di vantaggi come la velocità, HTTP/2, SPDY, salva. ..

2) Non ho avuto alcun problema.

3) È necessario solo un com.android.volley.RequestQueue per entrambi. Date un'occhiata a questo ->https://goo.gl/GMn3Ls

Ho scritto su OkHttp + Volley + Gson qui ->https://goo.gl/nl2DfN.Penso che potrebbe essere interessante per te.

+0

Grazie! Bell'articolo Ho usato OkHttp + Volley nella mia app da qualche tempo e funziona bene. Sto aggiungendo il supporto Gson ad esso ora. A proposito, qual è il problema con okhttp-urlconnection? Qual è il vantaggio di questo: https://goo.gl/ZZRSQ5 – User31689

+0

Questo stack è in linea con Retrofit? –

+0

Il retrofit è uno stack DIVERSO. Non sono sicuro di avere la tua domanda @IgorGanaposlky. – Sotti