如何使用Retrofit2和RxAndroid取消请求

7

我正在使用Retrofit 2.0和Rx-android来加载我的API。我遵循了这个网站的RxJava Integration with CallAdapter部分,详情请见此处,它运行良好。但是,我不知道如何通过可观察对象取消加载请求。请帮忙提供一些想法。

1个回答

17
取消RxJava Observable执行的唯一方法是从中取消订阅。RxJavaCallAdapter将取消委托给okhttp客户端。
因此,您只需像这样执行取消订阅操作:
Subscription subscription = getObservable().subscribe();

//When you want to stop execution
subscription.unsubsribe();

你可以在这里查看代码。具体来说,这些是代码行。

final Call<T> call = originalCall.clone();

// Attempt to cancel the call if it is still in-flight on unsubscription.
subscriber.add(Subscriptions.create(new Action0() {
  @Override public void call() {
    call.cancel();
  }
}));

我刚刚测试了'unsubscribe()',并且发现它可以正常工作。订阅者将不再被调用。但是为什么Okhttp会继续多次打印日志呢?我该如何检查Okhttp是否已经被取消? - Nguyen Minh Binh
1
我也检查过了,它可以工作,简单地打印出GET和END GET。但是当然,并不是所有的请求都能被停止。也许你在这种情况下遇到了问题。但它仍然是取消请求的唯一方法,而且与Retrofit Call cancel完全相同。您可以通过将断点放在call.cancel();上来检查它。 - Vasilov Artur
谢谢你,Vasilov。既然这是唯一的方法,我会在找到更好的解决方案之前继续使用它。 - Nguyen Minh Binh
@VasilovArtur 源代码链接已失效。这是最新的链接: https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit2/adapter/rxjava/RxJavaCallAdapterFactory.java 它不包含您提供的那段代码片段。 - Etienne Lawlor
1
@toobsco42 实际上这并没有改变什么。当您取消订阅时,调用仍然被取消,现在它在这里 https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit2/adapter/rxjava/CallArbiter.java#L47 - Vasilov Artur
在Observer的回调方法中,如何检查调用是否被取消? - Etienne Lawlor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接