2017-06-15 132 views
8

我正在执行一个网络请求,在该请求中我发送文件和消息。 我想有一个选项来取消当前请求。我发现了两个类似的问题,都暗示observable.subscribe(Observer)返回具有方法unsubscribe()的订阅对象。Retrofit 2 + RxJava取消/取消订阅

Here is the first one

And the second one

就我而言,我使用observable.subscribe(Observer)这是无效的。这里是我的代码:

Observable<MessengerRaw> observable = mModel.sendMessage(message, companion, description, multiParts); 
     observable.subscribe(new Observer<MessengerRaw>() { 
      @Override 
      public void onSubscribe(Disposable d) { 

      } 

      @Override 
      public void onNext(MessengerRaw value) { 
       if (getView() != null) { 
        ((MessengerActivity) getView()).resetMessegeView(); 
        ((MessengerActivity) getView()).updateMessageList(); 
       } 
      } 

      @Override 
      public void onError(Throwable e) { 
       getData().remove(0); 
       if (getView() != null) { 
        ((MessengerActivity) getView()).updateMessageList(); 
       } 
      } 

      @Override 
      public void onComplete() { 
       hideProgress(); 
      } 
     }); 

那么如何取消订阅/取消我的请求? 谢谢。

回答

8

在RxJava2中,您可以在oserver的onSubscribe回调方法中获得Disposable对象,您可以使用它来处理订阅。

+0

我会将此答案标记为已接受,因为它直接指向解决方案。以前接受的答案没有正确编辑。干杯。 – Sermilion

0

您可以使用Observable.subsribeWith(Observer)

来自实例文档:

Observable<Integer> source = Observable.range(1, 10); 
CompositeDisposable composite = new CompositeDisposable(); 

ResourceObserver<Integer> rs = new ResourceObserver<>() { 
    // ... 
}; 

composite.add(source.subscribeWith(rs)); 
+3

我的问题是“如何取消订阅”。我不明白你的回答有什么相关性。 – Sermilion

2

在RXJava当您想退订,必须使用预订了退订

private Subscription mSubscription; 

/.../ 

Observable<MessengerRaw> observable = mModel.sendMessage(message, companion, description, multiParts); 
Subscription subscription = observable.subscribe(new Observer<MessengerRaw>() {/.../}); 

你可以叫

if(!subscription.isUnsubscribed()){ 
    subscription.unsubscribe(); 
} 

在RXJava 2 observable.subscribe(new Observer<MessengerRaw>() {/.../});中返回一次性对象,可以调用dispose();

+1

observable.subscribe(new Observer (){/.../});不具有返回订阅的重载版本。有些版本会返回Disposable,Observable 和void。 – Sermilion

+0

您可以调用dispose(); –

+1

你是对的:@Override public void onSubscribe(Disposable d){ }有一次性的我可以调用dispose()并请求取消。谢谢。您可以将其纳入您的答案,以便其他人可以立即看到。 – Sermilion