我有一股Foo。 Foo发出需要布局Android视图(宽度和高度> 0)。我使用RxBinding,即
fooOservable()
.subscribe(foo -> {});
RxView.preDraws(mPager, () -> true)
.take(1);
当这个可观察的视图发出(或完成,视图中的视图)视图时。
我需要的是fooObservable()等到RxView发出,即视图布局。我不能只是fooObservable.filter(宽度&&高度> 0),因为它会丢弃发射。 我需要的是让foo的最后一个发出缓存(如果视图没有布局)并在第一个RxView.preDraws之后重新发送。,如果它已经布局,它应该正常通过
答案 0 :(得分:2)
您可以使用delay
或delaySubsription
。有些表格会延迟发出或订阅,直到另一个观察者发出一些东西。在第一种情况下,您将只有emition延迟,在第二种情况下,整个订阅将被延迟。
答案 1 :(得分:1)
我已经使用延迟编写了一个样本,以便在发出数据之前等待另一个observable。
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)
}
}
我使用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