2017-01-06 5 views
1

Ich schaute mir das Beispiel einer Android-App in MVP (link here) codiert. Aber jetzt möchte ich den gegebenen RxJava1-Code im Tutorial zu einem RxJava2-Code umcodieren. Allerdings habe ich Probleme damit, vor allem unSubscribe() und isUnSubscribed(). Ich habe versucht, es zu konvertieren, und ich werde meinen Versuch teilen.Migration von RxJava1 nach RxJava2

RxJava1 Code:

public void doLogin(AuthCredentials credentials) { 
    cancelSubscription(); 
    subscriber = new Subscriber<Account>() { 
     @Override public void onCompleted() { 
     if (isViewAttached()) { 
      getView().loginSuccessful(); 
     } 
     } 

     @Override public void onError(Throwable e) { 
     if (isViewAttached()) { 
      getView().showError(); 
     } 
     } 

     @Override public void onNext(Account account) { 
     eventBus.post(new LoginSuccessfulEvent(account)); 
     } 
    }; 

    // do login 
    accountManager.doLogin(credentials) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(subscriber); 
    } 
    private void cancelSubscription() { 
    if (subscriber != null && !subscriber.isUnsubscribed()) { 
     subscriber.unsubscribe(); 
    } 
    } 

Dies ist mein Versuch, auf RxJava2 Code:

public void doLogin(AuthCredentials credentials) { 
    cancelSubscription(); 
    subscriber = new Subscriber<Account>() { 

     @Override public void onSubscribe(Subscription s) { 
     // do login 
     accountManager.doLogin(credentials) 
         .subscribeOn(Schedulers.io()) 
         .observeOn(AndroidSchedulers.mainThread()) 
         .subscribe(subscriber); 
     } 

     @Override public void onCompleted() { 
     if (isViewAttached()) { 
      getView().loginSuccessful(); 
     } 
     } 

     @Override public void onError(Throwable e) { 
     if (isViewAttached()) { 
      getView().showError(); 
     } 
     } 

     @Override public void onNext(Account account) { 
     eventBus.post(new LoginSuccessfulEvent(account)); 
     } 
    }; 
    } 


    private void cancelSubscription() { 
    //isUnsubscribed and unsubscribe doesnt work anymore 
    } 

ich ziemlich neu bin auf das Konzept der RxJava. Wenn jemand meine Fehler aufzeigen und mir zeigen kann, dass das großartig wäre. :)

+0

Bitte lesen Sie die [Was anders ist] (https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0) Wiki-Seite. Ihr Fall ist in [this] (https://github.com/ReactiveX/RxJava/wiki/What-different-in--2.0#subscriber) Abschnitt abgedeckt. – akarnokd

+0

Ja, ich weiß. Ich habe das Problem bereits gelöst. Wird die Antwort bald posten. –

Antwort

1

Ich entschuldige mich für die späte Antwort. War sehr beschäftigt. Wie von @akarnokd angegeben, wurden in RxJava2 viele Änderungen gegenüber RxJava1 vorgenommen. Für diejenigen, die interessiert sind, schauen Sie sich bitte video an.

Was die obige Frage betrifft, so können wir das gleiche mit Hilfe DisposableObservables

Hier ist die Antwort auf die obige Frage erreichen. Ich habe es getestet und es funktioniert.

public void doLogin(AuthCredentials credentials) { 
    myDisposableObserver = new DisposableObserver<Account>() { 
       @Override 
       public void onNext(Account account) { 
        eventBus.post(new LoginSuccessfulEvent(account)); 
       } 

       @Override 
       public void onError(Throwable e) { 
        if (isViewAttached()) { 
         getView().showError(); 
        } 
       } 

       @Override 
       public void onComplete() { 
        if (isViewAttached()) { 
         getView().loginSuccessful(); 
        } 
       } 
      }; 

      // do login 
      accountManager.doLogin(credentials) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(subscriber); 
     } 
    } 

    private void cancelSubscriptionToMyPrescriptorManager() { 
     if (myDisposableObserver != null && !myDisposableObserver.isDisposed()) { 
      myDisposableObserver.dispose(); 
     } 
    }