2017-04-14 28 views
1
安排基本算
mSubscriptions.add(api.signIn(phoneNumber, otp) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .doOnError(throwable -> Timber.e(throwable.getMessage())) 
     .onErrorResumeNext(throwable -> Observable.empty()) 
     .subscribe(user -> { 
      // Handle user object logic here 
      } 
     })); 

我一般在我所有的應用程序的調度使用這個模式,並處理異常,但有時我得到一個非法狀態異常喜歡這個正確的方法:拋出異常的Scheduler.Worker線。添加onError處理。由rx.exceptions.OnErrorNotImplementedException引發,所以我想知道這是否正確。 在此先感謝。在RxJava

回答

2

由於@yosriz提到 - 正確方式是實現onError在每個用戶的回調。在你的情況下,你得到OnErrorNotImplementedException最有可能是由於你的「處理用戶對象邏輯」拋出。

簡單的例子:

異常流中:

Observable.just("value") 
    .flatMap(s -> Observable.error(new IllegalStateException())) 
    .onErrorResumeNext(t -> Observable.empty()) 
    .doOnCompleted(() -> System.out.println("Completed")) 
    .subscribe(s -> {}); 

完成


異常中onNext回調:

Observable.just("value") 
    .onErrorResumeNext(t -> Observable.empty()) 
    .doOnCompleted(() -> System.out.println("Completed")) 
    .subscribe(s -> { 
     throw new IllegalStateException(); 
    }); 

rx.exceptions.OnErrorNotImplementedException ... 產生的原因:java.lang.IllegalStateException


異常在onNext回調,用戶的onerror的實施:

Observable.just("value") 
    .onErrorResumeNext(t -> Observable.empty()) 
    .doOnCompleted(() -> System.out.println("Completed")) 
    .subscribe(s -> { 
     throw new IllegalStateException(); 
    }, t -> { 
     System.out.println("Subscriber's onError triggered"); 
    }); 

用戶的onError的觸發

1

安排調度程序與您獲得的此類錯誤無關。如果您的訂閱服務器上沒有處理onError()(在方法subscribe()),並且在沒有任何處理的情況下您在流中的某處出現錯誤,則可能會發生此問題。
doOnError()不會解決這個問題,因爲它只是一個副作用操作符,可以用onError()執行一些操作。
事實上,在你的例子onErrorResumeNext()將處理錯誤,因爲它會吞下任何錯誤,所以可能你有其他情況下,你不處理所有的錯誤情況,從而得到了錯誤未實現的異常。
作爲一種普遍的模式,最好是在任何情況下做好準備並在訂戶處實施onError()以避免錯誤未在流中處理的情況。