2015-11-05 26 views
5

Obervable.subscribe(Action1)メソッドを呼び出すと、どこでもOnErrorNotImplementedExceptionが送出されませんが、Obervable.subscribe(Action1, Action1)を呼び出すと、通常通りエラーが発生したときに2番目のアクションが呼び出されます。私は2つの方法を試みた:私も2番目のアクションを渡すがあれば、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()OnErrorNotImplementedExceptiononErrorに投げない方法があることを望む。

答えて

8

ここで私たちはそれをどのようにしていますか。アクションを作成する代わりに、onErrorとonCompletedを実装した抽象的なNYSubscriberを作成しました。この方法であなたは(も、あなたがラムダを失うことができないこのサブスクライバを使用してのみonNextコールバックを実装するか、onErrorメソッドをオーバーライドして、ここで必要な

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

@Override 
public void onCompleted() { 
} 

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

ありがとうございます!はい、これは方法です。私の問題は、このようにして、私はサブスクライバのラムダ構文を失い、私は常に匿名クラスを追加する必要があるということです。 : – WonderCsabo

+0

ラムダまたはサブクラスで空の 'onError()'実装を渡す以外の方法はありませんので、私はこの答えを受け入れています。 – WonderCsabo

+0

@WonderCsabo下の私のソリューションをチェックしてください – FireZenk

8

は別の可能な解決策であるとき、あなたはonNextとのThrowableを定義することができonCompletedことができ構文):あなたはこのように行うとエラーが発生したときに

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

ありがとう!どこにでもダミーのonErrorがありますが、他の解決策がないので、私は今やります。 – WonderCsabo

0

「.onErrorResumeNext(Observable.empty())」あなたのストリームが完成されます - あなたの行動が呼び出されない理由です。 あなたはユーザー '.retry()'を使用することができます。エラーが発生した場合、ストリームは自動的に再開されます。