2017-08-31 6 views
1

私はFooのストリームを持っています。 FooではAndroidビューを配置する必要があります(幅と高さ> 0)。私はこの観察発する(またはテイクのcuzの終了)のビューがレイアウトさ別のストリームが放出されるまでフィルタリングするストリームですが、一度第2ストリームが放出されると、それらのフィルタリングされた放出物を再放出します

fooOservable() 
    .subscribe(foo -> {}); 

RxView.preDraws(mPager,() -> true) 
        .take(1); 

その即ち

ためRxBindingを使用します。

私が必要とするのは、RxViewがを放出するまで、すなわちビューがレイアウトされるまでfooObservable()が待つことです。私はちょうどfooObservable.filter(幅& &高さ> 0)、それが放出を落とすので傾ける。 私が必要とするのは、(ビューがレイアウトされていない場合)キャッシュされたfooの最後のemitを最初のRxView.preDrawsの後に再配置することです。、配置されている場合は、通常通り渡す必要があります

答えて

2

delayまたはdelaySubsriptionを使用できます。エミションやサブスクリプションを遅延させる形式があり、別のオブザーバブルが何かを放出するまで最初のケースではエミッションの遅延があり、2番目のケースではサブスクリプション全体が遅れることになります。

1

データを送信する前に、別の観測可能なデータを待つためにdelayを使用してサンプルを書きました。

class SimpleTest { 
    val testScheduler = TestScheduler() 

    @Test 
    fun test() { 
    fooObservable() 
     .doOnNext { logger("Next", it.toString()) } 
     .delay { Observable.timer(5, TimeUnit.SECONDS, testScheduler) } 
     .subscribe { logger("Delayed", it.toString()) } 

    testScheduler.advanceTimeBy(10, TimeUnit.SECONDS) 
    } 

    fun fooObservable(): Observable<Int> { 
    return Observable.just(1, 2, 3, 4) 
    } 

    fun logger(tag: String, message: String): Unit { 
    val formattedDate = Date(testScheduler.now()).format() 
    System.out.println("$tag @ $formattedDate: $message") 
    } 

    fun Date.format(): String { 
    return SimpleDateFormat("HH:mm:ss.SSS", Locale.US).format(this) 
    } 
} 

私は、2次観測値をシミュレートするために5秒タイマーを使用しました。

このコードは、その出力を出力します。

Next @ 21:00:00.000: 1 
Next @ 21:00:00.000: 2 
Next @ 21:00:00.000: 3 
Next @ 21:00:00.000: 4 
Delayed @ 21:00:05.000: 1 
Delayed @ 21:00:05.000: 2 
Delayed @ 21:00:05.000: 3 
Delayed @ 21:00:05.000: 4 
関連する問題