android - 从 RxJava1 迁移到 RxJava2

标签 android rx-android rx-java2

我正在查看用 MVP 编码的 Android 应用程序示例 ( link here )。但现在我想将教程中给定的 RxJava1 代码重新编码为 RxJava2 代码。但是,我遇到了麻烦,尤其是 unSubscribe()isUn​​Subscribed()。我尝试对其进行转换,我将分享我的尝试。

RxJava1代码:

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

这是我对 RxJava2 代码的尝试:

  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
  }

我对 RxJava 的概念相当陌生。如果有人能指出我的错误并指导我,那就太好了。 :)

最佳答案

对于迟到的答复,我深表歉意。一直非常忙碌。正如 @akarnokd 所说,与 RxJava1 相比,RxJava2 进行了很多更改。有兴趣的请看这个video .

就上述问题而言,我们可以使用DisposableObservables来实现同样的效果

以上问题的答案如下。我已经测试过了,它有效。

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

关于android - 从 RxJava1 迁移到 RxJava2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41510213/

相关文章:

android - Rx 2 Android 对于 api 调用,Single 或 Observable 哪个更好?

rx-java - RxJava : create a self-dependent stream

java - 在 RxJava 中抛出订阅异常

java - RxJava2 批处理项

android - 具有单一数据输入的 MPAndroid 线图

android - 替换 fragment 的有效方法

android - 模拟器上的 RecognizerIntent

android - 为什么有些用户在 SQLiteDatabase.dbopen() 中得到 SQLiteException?

java - repeatWhen() 没有完成

error-handling - 发生错误时执行操作RxJava