RxJava(Android) - 中间步骤出错,错误解决后重试

时间:2016-11-17 17:52:22

标签: rx-java chaining

我目前正试图让自己进入RxJava。

现在我有以下情况:
我必须验证用户身份。

我需要为此做的步骤如下:

  1. 尝试使用本地存储的令牌
  2. 对用户进行身份验证
  3. 如果身份验证失败(由于令牌过期),请尝试使用本地存储获取新令牌 刷新令牌
  4. 替代品:
    • 成功:
      1. 在本地保存新获取的令牌
      2. 尝试再次进行身份验证,如果失败,则显示错误
    • 失败时(因为刷新令牌已过期):显示登录对话框
    • 失败(由于其他原因):显示错误
  5. 我已经实现的是2个Observable,一个用于身份验证,一个用于刷新令牌。 那些返回2种不同类型的结果。

    我现在很难将这些链接到上面提到的步骤中。 是否有人可以给我一个提示?

    或者更像是一个单独的类来处理这个过程而不是RxJava链(因为太复杂了)?

1 个答案:

答案 0 :(得分:2)

我认为这可以使用错误处理运算符onErrorResumeNext()以更简单的方式完成,该运算符将控制传递给另一个Observable而不是调用onError(),如果observable遇到错误。

让我们假设你的2个观察者是:

// Assuming authenticate returns an exception of typeA if it fails
Observable<A> authenticate;
// returns an exception of typeB if refresh fails
Observable<B> refresh;

现在让我们使用concatMap创建另一个observable。

// Probably you want to emit token from refresh observable. If not,
// then I hope you will get the idea how it's done. 
Observable<Object> refreshThenAuthenticate = refresh.concatMap(new Func1<A, Observable<B>>() {
        @Override
        public Observable<A> call(B b) {
            // create an authentication observable using the token
            return createAuthenticateObservable(b.getToken());
        }
});
// Above can be written in much simpler form if you use Java 8 lambdas.


/* first authenticate will be executed, if it fails then control will
 * go to refreshThenAuthenticate.
 */
authenticate
.onErrorResumeNext(refreshThenAuthenticate)
.subscribe(new Observer<A>() {
            @Override
            public void onCompleted() {
               // login successful
            }

            @Override
            public void onError(Throwable e) {
                // if e of typeA show login dialog
                // else do something else
            }

            @Override
            public void onNext(A a) {

            }
        });