java - 使用 Square 的 Retrofit Client,是否可以取消正在进行的请求?如果有怎么办?

标签 java android networking retrofit

我正在使用 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) 是可能的。我们应该期待即将到来的 Retrofit 具有相同的功能:

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

okClient.cancel(request);

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

okClient.cancel(request.tag());

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

Edit 2:Retrofit 2 具有完整的取消请求功能。

关于java - 使用 Square 的 Retrofit Client,是否可以取消正在进行的请求?如果有怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18131382/

相关文章:

android - 我怎样才能在我的应用程序中实现 longclickable

android - 如何在滚动时禁用蓝色阴影(Android 应用程序)。

java - 自动刷新不起作用,因为我希望它起作用

java - 如何打印链表中的内部节点?

java - 如何在 Java 中构建自定义 JTable,并在列名称上方添加一行

JavaFX 独立启动应用程序或从另一个应用程序启动

linux - VM 无法通过 NAT ping 通由两个交换机和一个路由器组成的主机

networking - 你如何在 Vagrant 中为 NFS 创建一个仅限主机的网络?

networking - 如何允许分段数据包通过防火墙(ipv4/v6)?

java - 使用 Java 的 Activity 流