我正在使用 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)
是可能的。我们应该期待即将到来的 Retrofit 具有相同的功能:
您可以使用实际的 Request
对象来取消它
okClient.cancel(request);
或者如果你已经为 Request.Builder
提供了标签,你必须使用
okClient.cancel(request.tag());
所有正在进行的、执行的或未决的请求都在 Dispatcher
、okClient.getDispatcher()
中排队。您也可以在此对象上调用取消方法。如果已经建立,Cancel 方法将通知 OkHttp Engine
终止与主机的连接。
Edit 2:Retrofit 2 具有完整的取消请求功能。
关于java - 使用 Square 的 Retrofit Client,是否可以取消正在进行的请求?如果有怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18131382/