使用Square的改造客户端,是否可以取消正在进行的请求?如果是这样,如何?
我正在使用Square的改造客户端从Android应用程序发出短暂的json请求。有没有办法取消请求?如果是这样,如何?
我正在使用Square的改造客户端从Android应用程序发出短暂的json请求。有没有办法取消请求?如果是这样,如何?
要取消异步改造请求,可以通过关闭执行异步请求的执行器服务来实现它。
例如,我有这个代码来构建: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更改日志执行是可能的。我们应该期待在即将到来的改造中具有相同的功能:.cancel(Object tag)
您可以使用实际对象来取消它Request
okClient.cancel(request);
或者如果您已经提供了标签,则必须使用Request.Builder
okClient.cancel(request.tag());
所有正在进行的、已执行的或挂起的请求都在 、 中排队。您也可以对此对象调用 cancel 方法。取消方法将通知 OkHttp 终止与主机的连接(如果已建立)。Dispatcher
okClient.getDispatcher()
Engine
编辑2:改造2具有完整的取消请求功能。
将回调包装在也实现回调的委托对象中。调用一些方法来清除委托,并在它得到响应时让它成为no-op。
请看下面的讨论
https://plus.google.com/107765816683139331166/posts/CBUQgzWzQjS
更好的策略是取消回调执行