我正在使用Square的Retrofit Client从Android应用程序发出短暂的json请求。有办法取消请求吗?如果是这样,怎么办?

最佳答案

要取消异步翻新请求,可以通过关闭执行异步请求的ExecutorService来实现。

例如,我有以下代码来构建RestAdapter:

Builder restAdapter = new RestAdapter.Builder();
restAdapter.setEndpoint(BASE_URL);
restAdapter.setClient(okClient);
restAdapter.setErrorHandler(mErrorHandler);
mExecutorService = Executors.newCachedThreadPool();
restAdapter.setExecutors(mExecutor, new MainThreadExecutor());
restAdapter.setConverter(new GsonConverter(gb.create()));

并采用了这种方法来强制放弃请求:
public void stopAll(){
   List<Runnable> pendingAndOngoing = mExecutorService.shutdownNow();
   // probably await for termination.
}

或者,您可以使用ExecutorCompletionServicepoll(timeout, TimeUnit.MILISECONDS)take()所有正在进行的任务。这将防止线程池像shutdownNow()那样被关闭,因此您可以重用ExecutorService
希望对某人有帮助。

编辑:从OkHttp 2开始RC1 changelog可以执行.cancel(Object tag)。我们应该在即将来临的改造中期待相同的功能:

您可以使用实际的Request对象将其取消
okClient.cancel(request);
或者如果您已将标签提供给Request.Builder,则必须使用
okClient.cancel(request.tag());
所有正在进行,已执行或待处理的请求都在DispatcherokClient.getDispatcher()内部排队。您也可以在此对象上调用cancel方法。如果已经建立,Cancel方法将通知OkHttp Engine终止与主机的连接。

编辑2 :翻新2具有全功能的取消请求。

07-28 01:53
查看更多