使用Square的改造客户端,是否可以取消正在进行的请求?如果是这样,如何?

2022-09-02 20:37:41

我正在使用Square的改造客户端从Android应用程序发出短暂的json请求。有没有办法取消请求?如果是这样,如何?


答案 1

要取消异步改造请求,可以通过关闭执行异步请求的执行器服务来实现它。

例如,我有这个代码来构建: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更改日志执行是可能的。我们应该期待在即将到来的改造中具有相同的功能:.cancel(Object tag)

您可以使用实际对象来取消它Request

okClient.cancel(request);

或者如果您已经提供了标签,则必须使用Request.Builder

okClient.cancel(request.tag());

所有正在进行的、已执行的或挂起的请求都在 、 中排队。您也可以对此对象调用 cancel 方法。取消方法将通知 OkHttp 终止与主机的连接(如果已建立)。DispatcherokClient.getDispatcher()Engine

编辑2:改造2具有完整的取消请求功能。


答案 2

将回调包装在也实现回调的委托对象中。调用一些方法来清除委托,并在它得到响应时让它成为no-op。

请看下面的讨论

https://plus.google.com/107765816683139331166/posts/CBUQgzWzQjS

更好的策略是取消回调执行

https://stackoverflow.com/a/23271559/1446469


推荐