2017-07-08 6 views
0

ObservableEmitterのonErrorには渡すThrowableインスタンスが必要ですが、何らかのエラーデータがあればベストプラクティスは何ですか?以下のように:AndroidのRxJavaでonError + Throwableを正しく使用する方法は?

Observable<JSONObject> o1 = Observable.create(new ObservableOnSubscribe<JSONObject>() { 
    @Override 
    public void subscribe(final ObservableEmitter<JSONObject> e) throws Exception { 
    RemoteApi.getInstance().addR(context, tag, new AsyncCallback<JSONObject, Error>() { 
     @Override 
     public void onSuccess(JSONObject result) { 
     if(e.isDisposed()) { 
      return; 
     } 
     e.onNext(result); 
     e.onComplete(); 
     } 

     @Override 
     public void onFailure(Error error) { 
     if(e.isDisposed()) { 
      return; 
     } 
     e.onError(new Throwable(error.getCode() + " " + error.getMessage())); 
     } 
    }); 
    } 
}); 

正しくエラーデータを渡すには?私はちょうどこの種の例外のラッパークラスを作成します:

private static class RxJavaExceptionError extends Exception { 
    private Object object; 
    public RxJavaExceptionError(Object object) { 
     this.object = object; 
    } 
    public Object get() { 
     return object; 
    } 
} 

私はオブジェクトを使ってデータを渡します。しかし、RxJavaExceptionErrorかどうかを判断するためにinstanceofを使う必要があることがわかりました。これはあまりうれしくありません。では、この場合のベストプラクティスは何ですか?私はこれが珍しいケースではないと思う。

私はそれをはっきりと表現しましたか?私の英語はあまり良くありません。

答えて

0

申し訳ありません申し訳ありませんご使用のケースをよく理解していません。エラーのスロー可能なものをパイプラインに伝播させる場合は、operator onErrorResumeNextを試しましたか?

/** 
* Here we can see how onErrorResumeNext works and emit an item in case that an error occur in the pipeline and an exception is propagated 
*/ 
@Test 
public void observableOnErrorResumeNext() { 
    Subscription subscription = Observable.just(null) 
      .map(Object::toString) 
      .doOnError(failure -> System.out.println("Error:" + failure.getCause())) 
      .retryWhen(errors -> errors.doOnNext(o -> count++) 
          .flatMap(t -> count > 3 ? Observable.error(t) : 
            Observable.just(null).delay(100, TimeUnit.MILLISECONDS)), 
        Schedulers.newThread()) 
      .onErrorResumeNext(t -> { 
       System.out.println("Error after all retries:" + t.getCause()); 
       return Observable.just("I save the world for extinction!"); 
      }) 
      .subscribe(s -> System.out.println(s)); 
    new TestSubscriber((Observer) subscription).awaitTerminalEvent(500, TimeUnit.MILLISECONDS); 
} 

あなたはより多くの例がここに

https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/errors/ObservableExceptions.java

を見て確認したい場合
関連する問題