2017-11-20 24 views
2

に失敗した私はtimeotがocurringされたときに私の観察可能にretryWhenを実装しようとしていますが、私は奇妙なエラーがここIDEのAndroid Studioで3.0KotlinとRxJava型推論が

を強調していたコードです:

rxRssiRepository.onRssiUpdate() //returns Observable<RssiEvent> 
     .timeout(10, TimeUnit.MILLISECONDS) 
     .retryWhen { t: Observable<Throwable> -> 
      t.flatMap { error: Throwable -> 
       if (error is TimeoutException) { 
        stopLocationUpdates() 
        Log.v("TIMEOUT", "TIMEOUT RSSI EVENTS") 
        Observable.just(Observable.empty()) 
       } else { 
        Observable.error(error) 
       } 
      } 
     } 
     .concatMap { t: RssiEvent -> 
      appendRssiEvent(t) 
     } 
     .publish() 

IDEが赤.flatMapオペレーターに強調し、こう述べています。

型推論に失敗しました:

のパラメータRを推測するのに十分ではない情報を10

楽しいフラットマップ ( マッパー:((t:Throwable)→ObservableSource)!) 明示的に指定してください。 'もし' 演算子のための

同じ:制御フロー式の

型推論に失敗しました。オペレータ.justについて明示的

その型を指定してください:

型推論を失敗しました:不足していた情報を 楽しいだけ のパラメータTを推測する( アイテム:!T ) :観察可能! 明示的に指定してください。オペレータ.emptyについては

型推論に失敗しました: :観察可能:ちょうど (T ! 項目)

楽しみにパラメータTを推測するのに十分ではない情報を! 明示的に指定してください。

そして.ERROR事業者のための:

型推論に失敗しました: :観察可能:

楽しいエラー (!のThrowable 例外)のパラメータTを推測するのに十分ではない情報を! 明示的に指定してください。

これを修正するにはどうすればよいですか?私が意味する

は、このコードは、Javaでここにもありました: How to add a timeout to detect that an Observable didn't emit for a while

しかし、私はKotlinにsimiliaryそれを変換するとき、それは私にコンパイラがどのようなタイプを把握することはできません

答えて

3

説明した状況の問題を与えますあなたは帰りたい。

あなたの場合の最も簡単な解決方法は、返品タイプを入力することです。このようなものObservable.just(Observable.empty<Any>())。これでコンパイラはどのような型を返すかを知ることができます。

+0

ありがとうございました。しかし、このタイムアウトが発生すると、Observableというホストが破棄されます。これは発生したくありません。多分あなたはそれを防ぐ方法を知っていますか?私はこれを意味します:https://stackoverflow.com/questions/42805481/how-to-add-a-timeout-to-detect-that-an-observable-didnt-emit-for-a-while – Konrad

+0

'retryWhen'はオリジナルのソースは 'timeout'のためにエラーで終了します。私はそれを回避する方法を知らない。 – jbarat