使用Retrofit 2并行执行HTTP请求

15

我想要在Retrofit 2中实现多个并行请求。我有以下结构来进行3次请求:

HistoricalRApi.IStockChart service=HistoricalRApi.getMyApiService();
        //^BVSP,^DJI,^IXIC
        Call<HistoricalDataResponseTimestamp> call1= service.get1DHistoricalDataByStock("^IXIC");
        Call<HistoricalDataResponseTimestamp> call2= service.get1DHistoricalDataByStock("^DJI");
        Call<HistoricalDataResponseTimestamp> call3= service.get1DHistoricalDataByStock("^GSPC");
        call1.enqueue(retrofitCallbackAmerica());
        call2.enqueue(retrofitCallbackAmerica());
        call3.enqueue(retrofitCallbackAmerica());
}

我已经阅读到,在Retrofit1中,当定义REST适配器时,可以像这样使用.setExecutor来定义并行请求:

RestAdapter adapter = new RestAdapter.Builder()
                .setEndpoint(END_POINT) 
                .setLogLevel(RestAdapter.LogLevel.FULL) 
                .setExecutors(Executors.newFixedThreadPool(3), null)
                .build(); 

我的问题是如何在Retrofit 2中实现相同的效果?提前致谢。


2
https://github.com/square/retrofit/issues/1259 - Breavyn
1个回答

21

感谢Colin Gillespie提供的链接,我已经按照Jake Wharton的建议实施了,并得到了以下结果:

 public static IStockChart getMyApiService() {
        OkHttpClient client=new OkHttpClient();
        Dispatcher dispatcher=new Dispatcher();
        dispatcher.setMaxRequests(3);
        client.setDispatcher(dispatcher);
       // OkHttpClient client = new OkHttpClient();
       //  HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
       //  interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
       //  client.interceptors().add(interceptor);
        if(myService ==null){
            Retrofit retrofit=new Retrofit.Builder()
                    .baseUrl("http://chartapi.finance.yahoo.com/")
                    .addConverterFactory(JsonpGsonConverterFactory.create())
                    .client(client)
                    .build();
            myService=retrofit.create(IStockChart.class);
            return myService;
        } else {
            return myService;
        }



    }

1
如果用户离开应用或活动并且想要节省资源,您甚至可以获取调度程序并取消所有请求(挂起和执行)。因为未决的请求最终都会完成。dispatcher.cancelAll() - Sergio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接