2015-06-09 46 views
14

我有休息api。如何取消任务与改造和rxjava

@Get("/serveraction") 
public Observable<String> myRequest(@Query("Data") String data); 

我知道,那okhttp已取消的功能(通过请求对象,按标签),但不知道如何与改造和rxjava使用它。使用改进和rxjava实现取消网络任务机制的最佳方法是什么?

回答

20

您可以使用标准的RxJava取消机制Subscription

Observable<String> o = retrofit.getObservable(..); 
Subscription s = o.subscribe(...); 

// later when not needed 
s.unsubscribe(); 

Retrofit RxJava连接器会将此呼叫重定向到okHttp的取消。请参阅:https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit2/RxJavaCallAdapterFactory.java#L102

+0

供参考:我非常确定[ObservableCallAdapterFactory](https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit/ObservableCallAdapterFactory.java)在改造-adpaters将成为尚未发布的Retrofit 2.0的一部分,目前不属于Retrofit 1.9的一部分。如上所述,通过@Sergii取消订阅仍然可以实现您的订阅者没有得到响应的效果,但是如何在内部取消它并不那么干净,并且您可能会看到一些线程中断的异常(但它们不会使您的应用程序崩溃)。 – Nick

+3

链接已死 –

+0

谢谢。更新。 –

1

所选答案适用于Rx Java 1,且不适用于RxJava2。对于后者,您可以使用一次性使用。按照此:

  1. Activity或类Fragment定义CompositeDisposable compositeDisposable=new CompositeDisposable()作为一个字段。
  2. 定义使用改造2作为像这样的API:

    public Observable<YourPojo> callApiWithRetrofit() { 
        return getService(YourApiService.class).callApi(); 
    } 
    
  3. 定义Disposable,并把它添加到compositeDisposable实例:

    Disposable disposable = callApiWithRetrofit().subscribeOn(Schedulers.io()).observeOn(
         AndroidSchedulers.mainThread()).subscribeWith(
         new DisposableObserver<List<YourPojo>>() { 
          @Override 
          protected void onStart() { 
           super.onStart(); 
          } 
    
          @Override 
          public void onNext(@NonNull List<AlertAssetDTO> listResponse) { 
    
          } 
    
          @Override 
          public void onError(@NonNull Throwable e) { 
    
          } 
    
          @Override 
          public void onComplete() { 
    
          } 
         }); 
    mCompositeDisposable.add(alertAssetsDisposable); 
    
  4. 不管你想要的连接被取消(例如onDestroy()方法ActivityFragment)请致电 mCompositeDisposable.clear();

多种一次性物品可以通过这种方式添加到CompostieDisposable中。

+0

原始(v1)答案中最重要的部分是它实际上取消了请求:''Retrofit RxJava连接器将把这个调用重定向到okHttp的取消。看到这里:''..在这个答案中缺少(旧的链接现在被破坏) – minsk