我正在使用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.
}
或者,您可以使用
ExecutorCompletionService
和poll(timeout, TimeUnit.MILISECONDS)
或take()
所有正在进行的任务。这将防止线程池像shutdownNow()
那样被关闭,因此您可以重用ExecutorService
希望对某人有帮助。
编辑:从OkHttp 2开始RC1 changelog可以执行
.cancel(Object tag)
。我们应该在即将来临的改造中期待相同的功能:您可以使用实际的
Request
对象将其取消okClient.cancel(request);
或者如果您已将标签提供给
Request.Builder
,则必须使用okClient.cancel(request.tag());
所有正在进行,已执行或待处理的请求都在
Dispatcher
和okClient.getDispatcher()
内部排队。您也可以在此对象上调用cancel方法。如果已经建立,Cancel方法将通知OkHttp Engine
终止与主机的连接。编辑2 :翻新2具有全功能的取消请求。