2015-11-05 45 views
5

我想要實現,如果我打電話Obervable.subscribe(Action1)方法,它不扔OnErrorNotImplementedException任何地方,但如果我打電話Obervable.subscribe(Action1, Action1),第二個動作被稱爲當正常提出錯誤時調用。我嘗試了兩種方式:防止OnErrorNotImplementedException

.onErrorResumeNext(Observable.empty()) 

這樣OnErrorNotImplementedException不拋出,但是如果我還通過第二動作,動作也從未叫。

二:

.lift(new Observable.Operator<T, T>() { 
    @Override 
    public Subscriber<? super T> call(Subscriber<? super T> subscriber) { 
     return new Subscriber<T>() { 
      @Override 
      public void onCompleted() { 
       if (!subscriber.isUnsubscribed()) { 
        subscriber.onCompleted(); 
       } 
      } 

      @Override 
      public void onError(Throwable e) { 
       if (!subscriber.isUnsubscribed()) { 
        try { 
         subscriber.onError(e); 
        } catch (Throwable t) { 
         if (!(t instanceof OnErrorNotImplementedException)) { 
          throw t; 
         } 
        } 
       } 
      } 

      @Override 
      public void onNext(T t) { 
       if (!isUnsubscribed()) { 
        subscriber.onNext(t); 
       } 
      } 
     }; 
    } 
}); 

與此問題如果observeOn()被稱爲後,那麼這將是異步的,顯然我的異常處理在這裏是行不通的。

有沒有辦法做到這一點。我希望有一個subscribe()方法,它不會在onError中丟出OnErrorNotImplementedException

回答

8

這裏是我們如何在工作中做到這一點。我們沒有采取行動,而是製作了一個具有onError和onCompleted實現的抽象NYTSubscriber。這樣,您就可以使用這個用戶,只有實現onNext回調或者你可以重寫的onError和onCompleted必要時

public abstract class NYTSubscriber<T> extends Subscriber<T> { 

@Override 
public void onCompleted() { 
} 

@Override 
public void onError(Throwable e) { 
} 
} 
+1

謝謝!是的,這是一種方式。我的問題是,以這種方式,我鬆開了用戶的lambda語法,我總是不得不添加匿名類。 :( – WonderCsabo

+0

顯然,除了傳遞一個空的'onError()'實現,無論是lambda還是子類,沒有別的辦法,所以我接受這個答案。 – WonderCsabo

+0

查看下面的解決方案@WonderCsabo – FireZenk

8

這裏是另一個可能的解決方案,你可以定義onNext和Throwable的(你也可以不鬆拉姆達語法):

.subscribe(t -> doSomething(t), e -> showError(e)); 
+1

謝謝!好吧,我的意圖不是添加一個虛擬的onError無處不在,但由於沒有其他解決方案,我現在就做。 – WonderCsabo

0

當你做這樣的「.onErrorResumeNext(Observable.empty())」你流時發生錯誤將完成 - 這就是爲什麼你的行爲不會被調用。 你可以使用'.retry()',當你有錯誤時你的流將自動重啓。