2017-07-27 9 views
1

リモートサービスに接続するタスクがあります。それが接続されていないとき - 接続手順全体を起動します。この目的のために、私はこのメソッドを書いた -どのように正しく完成するflatMapチェーン内のCompletable?

public Completable execute() { 
     return fptrService.isConnected() 
      .flatMap(isConnected -> { 
       if (isConnected) return Single.never(); 
       else return bluetoothService.isBluetoothAvailable(); 
      }) 
      .flatMap(isAvailable -> { 
       if (isAvailable) return bluetoothService.isBluetoothActivated(); 
       else throw new BluetoothNotAvailableException(); 
      }) 
      .flatMap(isActivated -> { 
       if (isActivated) return bluetoothService.searchForFptr(); 
       else throw new BluetoothNotActivatedException(); 
      }) 
      .flatMapCompletable(fptrService::connect); 
    } 

第1の場合、サービスが接続されていない - すべて正常に動作します。しかし、最初の段階でisConnected()がTRUEを返し、すべてのチェーン・ストールとCompletableはまったく完了しません。私は最初の段階で完全に強制することができますか?あなたはこれで言った何

+0

試みを返すように 'Completable.complete()'の代わりにSingle.never() –

+0

が...しようとしました(しかし、flatMapはシングル返すように望んでいるの、完了していない –

答えて

0
 

    .flatMap(isConnected -> { 
     if (isConnected) return Single.never(); 
     else return bluetoothService.isBluetoothAvailable(); 
    }) 
 

isConnectedtrueであれば、その後、このように、この観測可能な意志が終了したことがない、アイテムを放出しないことです。

代わりに、あなたは下流Single of false渡す必要があります。

 

    .flatMap(isConnected -> { 
     if (isConnected) return Single.just(Boolean.FALSE); 
     else return bluetoothService.isBluetoothAvailable(); 
    }) 
    // Will continue stream if `isConnected` is true 
    .filter(isConnected -> isConnected) 
    // if `isConnected` is false, then downstream operators won't be executed 
 
+0

このソリューションは、チェーンの2番目のステップでBluetoothNotAvailableExceptionを引き起こしますが、そうでないかもしれません。私が必要とするのは、最初のステップでCompletableです。このための "チェーン"ソリューションはないと思う、私はクエリを再構成する必要があります... –

+0

@ЕвгенийКравцов、あなたはobservabを終了することはできません'isConnected'状態のobservableを' filter() 'することができるので、その演算子の後で例外がスローされないことを確かめることができます。答えを更新しました。 – azizbekian

関連する問題