2015-05-13 37 views
2

如何將observable的錯誤轉換爲另一個observable?將RxJava observable的錯誤轉換爲另一個可觀察和吞下的成功

我想實現算法顯示以下方案:

Block scheme

我使用了一個名爲所著的Grokking RxJava教程,開始我的學習,發現flatMap運營商可以將一個可觀察返回由改造成另一種這使我可以執行一系列服務器方法的調用。但在教程鏈接方法總是返回成功的結果。 如果其中一個遠程方法返回錯誤,我該如何做相同的鏈接?

目前我使用的是看起來很奇怪和不明確的,以我的方法:

AppObservable.bindActivity(this, userService.checklogin(mPhone) 
      .onErrorResumeNext(new Func1<Throwable, Observable<? extends Response>>() { 
       @Override 
       public Observable<? extends Response> call(Throwable throwable) { 
        return Observable.just(null); 
       } 
      })) 
      .flatMap(new Func1<Response, Observable<Response>>() { 
       @Override 
       public Observable<Response> call(Response response) { 
        if (response == null) { 
         return AppObservable.bindActivity(RegistrationActivity.this, userService.register(
           mPhone, 
           name.getText().toString(), 
           selectedSex, 
           selectedDateDay, 
           selectedDateMonth, 
           selectedDateYear, 
           Locale.getDefault().getLanguage(), 
           persistentUserInfoStore.getInstallationToken() 
         )); 
        } 
        phone.setError(getString(R.string.already_registered_phone)); 
        progressDialog.dismiss(); 
        return Observable.empty(); 
       } 
      }) 
      .subscribe(new Action1<Response>() { 
       @Override 
       public void call(Response response) { 
        startConfirmationActivity(); 
        progressDialog.dismiss(); 
       } 
      }, new Action1<Throwable>() { 
       @Override 
       public void call(Throwable throwable) { 
        progressDialog.dismiss(); 
        Toast.makeText(RegistrationActivity.this, "Error while register user", Toast.LENGTH_SHORT).show(); 
       } 
      }); 

是否有更清晰的方式來做到這一點。

P.S.我在RxJava非常新。

+0

你爲什麼不從'onErrorResumeNext'函數調用'userService.register'? –

+0

@VladimirMironov我不知道之後會發生什麼。如果我理解正確,在傳遞userService.register到onErrorResumeNext以防可觀察的userService.checkLogin中的錯誤時,它的訂閱者將被重新訂閱到userService.register,並且將消耗其排放。我怎樣才能從userService.register和userService.checkLogin中分離出成功的排放? –

+0

http://pastebin.com/Cu32c8tc怎麼樣? –

回答

4
  1. 你應該叫一個userService.registeronErrorResumeNext
  2. 區分發生什麼樣的錯誤,最簡單的方法是引入一個獨立的Exception類爲每個錯誤。

這是它的外觀在代碼:

userService.checkLogin(mPhone).flatMap(new Func1<Response, Observable<Response>() { 
    @Override 
    public Observable<? extends Response> call(final Response response) { 
     // according to your diagram the whole Observable should fail if first call was successful 
     return Observable.error(new FirstCallWasSuccessfulException(response)); 
    } 
}).onErrorResumeNext(new Func1<Throwable, Observable<? extends Response>>() { 
    @Override 
    public Observable<? extends Response> call(final Throwable throwable) { 
     if (throwable instanceof FirstCallWasSuccessfulException) { 
      return Observable.error(throwable); 
     } 

     return userService.register(...); 
    } 
}).subscribe(new Subscriber<Response>() { 
    @Override 
    public void onError(final Throwable throwable) { 
     if (throwable instanceof FirstCallWasSuccessfulException) { 
      // foo 
     } else { 
      // bar 
     } 
    } 

    @Override 
    public void onNext(final Response response) { 

    } 

    @Override 
    public void onCompleted() { 

    } 
}); 
相關問題