2017-10-10 9 views
3

RxJavaが新しくなった。私はこのようなコードを持っています。私はrepository.getStatus()から返された文字列からオブザーバブルを作成しています。 nullの場合は何もせずにproceedメソッドを続行する必要があります。それがヌルでない場合は、repository.init()に電話してからproceedに電話する必要があります。ここに私がしたことがあります。場合repository.getStatus()RxJava:Nullableオブジェクトからobservableを作成する

Flowable.just(repository.getStatus()) // getStatus return a string , which can be null 
     .doOnError(throwable -> proceed()) 
     .flatMapCompletable(s -> repository.init()) 
     .observeOn(Schedulers.io()) 
     .subscribeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new DisposableCompletableObserver() { 
         @Override 
         public void onComplete() { 
          proceed(); 
         } 

         @Override 
         public void onError(@NonNull Throwable e) { 
          handleErrors(t)); 
         } 
        }); 

private void proceed(){ 
    // 
} 

それはdoOnError(throwable -> proceed())を呼び出す文句を言わない、nullの? repository.getStatus()がnullの場合にクラッシュするようになりました。このようなユースケースを扱うには最高のRx方法は何ですか?

+0

チェック[この](https://stackoverflow.com/questions/ような何かを行うことができ、この

Flowable.just(repository.getStatus() == null ? Completable.complete() : repository.init()) .flatMapCompletable(c -> c) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new DisposableCompletableObserver() { @Override public void onComplete() { proceed(); } @Override public void onError(@NonNull Throwable e) { handleErrors(t)); } }); 

のようなものを試してみてください39781420/handling-null-in-rxjava2) – masp

+0

@maspしかし、受け入れられた答えで言われているように、上記のオプション24の「Optional.ofNullable」は必要です。私の最小バージョンは19 – Jrd

+0

です。答えとは別に、多くのことを理解できる会話の質問に[link](https://github.com/ReactiveX/RxJava/issues/4644)もあります。 – masp

答えて

3

を、あなただけに基づいて、これら2のいずれかから、観察を作成することができますあなたの状態。

あなたも、多分、あなたのrepository.getStatus()を作成し、この

Maybe.create((MaybeOnSubscribe<String>) e -> { 
     if (repository.getStatus() != null) e.onSuccess(repository.getStatus()); 
     e.onComplete(); 
    }).flatMapCompletable(s -> Completable.fromAction(() -> repository.init())) 
      .subscribe(new DisposableCompletableObserver() { 
       @Override 
       public void onComplete() { 
        proceed(); 
       } 

       @Override 
       public void onError(@NonNull Throwable e) { 
        handleErrors(t)); 
       } 
      }); 
2

Rx2を使用しているので、新しいMaybeタイプ(これはOptionalのストリーミングに相当)を使用できます。残念ながら、それは(https://github.com/ReactiveX/RxJava/issues/5019を参照)fromNullableファクトリメソッドを持っていませんが、あなたは、この使用することができます。代わりにrepository.init()repository.getStatus()を配管

Maybe.fromCallable(() -> repository.getStatus())

関連する問題