2017-06-15 131 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