2017-06-15 1 views
8

Ich führe eine Netzwerkanfrage durch, wo ich Dateien und eine Nachricht sende. Ich hätte gerne eine Option, um aktuelle Anfrage zu stornieren. Ich habe zwei ähnliche Fragen gefunden und beide schlagen vor, dass observable.subscribe(Observer) Subskriptionsobjekt mit der Methode unsubscribe() zurückgibt.Nachrüstung 2 + RxJava abbrechen/abbestellen

Here is the first one

And the second one

In meinem Fall verwende ich observable.subscribe(Observer) nichtig ist. Hier ist mein Code:

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(); 
      } 
     }); 

So wie kann ich meine Anfrage abbestellen/stornieren? Danke.

Antwort

8

In RxJava2 können Sie Disposable Objekt in OnSubscribe Callback-Methode von Oserver erhalten, die Sie verwenden können, um Abonnement zu beseitigen.

+0

Ich werde diese Antwort als akzeptiert markieren, weil sie direkt auf die Lösung hinweist. Die zuvor angenommene Antwort wurde nicht richtig bearbeitet. Prost. – Sermilion

0

können Sie Observable.subsribeWith(Observer)

Beispiel aus der Dokumentation verwenden:

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

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

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

Meine Frage ist "Wie kann ich mich abmelden". Ich verstehe nicht, wie deine Antwort relevant ist. – Sermilion

2

In RXJava müssen Sie Abonnements verwenden für abmelden

private Subscription mSubscription; 

/.../ 

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

Wenn Sie sich abmelden möchten, können Sie rufen

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

In RXJava 2 observable.subscribe(new Observer<MessengerRaw>() {/.../}); gibt Einwegobjekt zurück, Sie können dispose();

+1

observable.subscribe (neuer Observer () {/.../}); hat keine überladene Version, die Subscription zurückgibt. Es gibt Versionen, die Disposable, Observable und void zurückgeben. – Sermilion

+0

Sie können dispose() aufrufen; –

+1

Sie haben Recht: @Override öffentlichen void onSubscribe (Disposable d) { } hat das Disposable, auf dem ich dispose() aufrufen kann und fordert Abbrechen. Vielen Dank. Sie können in Ihre Antwort aufnehmen, damit andere sie sofort sehen können. – Sermilion