2016-07-23 19 views
5

Betrachten Sie die folgenden Initialisierungen von OkHttp und Retrofit:Okhttp ignoriert Dispatcher Einstellung verwendet wird, wenn mit Retrofit RxJavaCallAdapterFactory

public static SomeServiceRestInterface newRestService(String apiUrl) { 
      Retrofit retrofit = new Retrofit.Builder() 
        .baseUrl(apiUrl) 
        .client(createOkHttpClient()) 
        .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io())) 
        .addConverterFactory(createGsonConverter()) 
        .build(); 
      return retrofit.create(SomeServiceRestInterface.class); 
} 

private static OkHttpClient createOkHttpClient() { 
        Dispatcher dispatcher = new Dispatcher(); 
        dispatcher.setMaxRequestsPerHost(1); 
        dispatcher.setMaxRequests(1); 
        OkHttpClient.Builder builder = new OkHttpClient.Builder() 
           .dispatcher(dispatcher).build() 
} 

Beim Testen der Rest nennt, habe ich bemerkt, dass Okhttp nicht die setMaxRequestsPerHost oder setMaxRequests Einstellungen nicht einlöst an alle. Hier ist das Protokoll von 3 Anfragen, die gleichzeitig versendet werden:

23/07 04:14:22.668 [RxIoScheduler-4] DEBUG - --> POST https://XXX/1 http/1.1 
23/07 04:14:22.668 [RxIoScheduler-4] DEBUG - Content-Length: 0 
23/07 04:14:22.668 [RxIoScheduler-4] DEBUG - --> END POST (0-byte body) 
23/07 04:14:22.672 [RxIoScheduler-7] DEBUG - --> POST https://XXX/2 http/1.1 
23/07 04:14:22.673 [RxIoScheduler-7] DEBUG - Content-Length: 0 
23/07 04:14:22.673 [RxIoScheduler-7] DEBUG - --> END POST (0-byte body) 
23/07 04:14:22.676 [RxIoScheduler-6] DEBUG - --> POST https://XXX/3 http/1.1 
23/07 04:14:22.677 [RxIoScheduler-6] DEBUG - Content-Length: 0 
23/07 04:14:22.677 [RxIoScheduler-6] DEBUG - --> END POST (0-byte body) 

wo XXX ist die gleiche Domäne, 1/2/3 sind verschiedene Pfade.

Ich bin mir nicht sicher, warum, aber ich dachte, dass dies möglicherweise mit dem RxJava Scheduler Set in addCallAdapterFactory zu tun hat.

Ist das ein Fehler? oder verpasse ich etwas?

Ich benutze okhttp 3.4.1 und nachrüsten 2.1.0.

+0

Haben Sie überprüft, wie viele http-Clients Sie erstellen? –

Antwort

4

zu zitieren Jake Wharton zu diesem Thema:

Die Implementierung von beobachtbaren für Retrofit führen Anfragen synchron für jeden notwendigerweise auf dem angelegten Scheduler angewiesen zu begrenzen. Wenn Sie die Limits von OkHttps Dispatcher auf festgelegt haben, müssen Sie einen benutzerdefinierten CallAdapter für Observable schreiben, der Call.enqueue anstelle von Call.execute verwendet.

Wir haben derzeit keine Pläne, dies zu unterstützen, auch wenn es wahrscheinlich ist, dass Retrofit v3 auf einem hypothetischen OkHttp v4 gebaut könnte dies der Standard machen (obwohl dies ein langer Weg ist aus).

Dies ist das gleiche Verhalten, das Sie sehen würden, wenn Sie Retrofit Call und rief .execute() verwendet wird, oder sogar OkHttp Call mit seiner .execute() verwendet.