2016-07-23 104 views
5

考慮OkHttp以下的初始化和改造:Okhttp忽略調度設置

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

當測試REST調用,我注意到,Okhttp根本不兌現setMaxRequestsPerHost或setMaxRequests設置所有。以下是同時發送的3個請求的日誌:

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) 

其中XXX是相同的域,1/2/3是不同的路徑。

我不知道爲什麼,但我認爲這可能與在addCallAdapterFactory中設置的RxJava Scheduler有關。

這是一個錯誤?或者我錯過了什麼?

我使用的是okhttp 3.4.1,並且改進了2.1.0。

+0

您是否檢查過您創建了多少個http客戶端? –

回答

4

引述在這個問題上傑克沃頓:

的觀察到的,改造的實施執行請求 同步依靠應用調度任何必然 限制。如果您需要OkHttp的調度程序的限制爲 ,那麼您必須編寫一個自定義的CallAdapter for Observable ,它使用Call.enqueue而不是Call.execute。

我們目前還沒有計劃,以支持這一點,但很可能是建立在一個假設的OkHttp V4 改造V3可能使這個 默認的(儘管這是一個很長的路要走)。

如果您使用Retrofit的調用 並調用.execute(),或者甚至將OkHttp的調用與其.execute()一起使用,則會出現相同的行爲。