1

我有一个 Foo 流。Foo 发射需要布局 Android 视图(宽度和高度 > 0)。我为此使用 RxBinding

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

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

当这个 observable 发射(或完成,因为采取)视图被布置。

我需要的是 fooObservable() 等到 RxView 发出,即视图被布置。我不能只是 fooObservable.filter( width && height > 0 ),因为这会降低发射。我需要的是缓存 foo 的最后一个发射(如果视图没有布局)并在第一个 RxView.preDraws 之后重新发射。,如果是布局的话应该可以正常通过

4

2 回答 2

2

您可以使用delaydelaySubsription。有些形式会延迟发射或订阅,直到另一个 observable 发射一些东西。在第一种情况下,您只会有发射延迟,在第二种情况下,整个订阅将被延迟。

于 2017-08-31T15:26:34.060 回答
1

我已经编写了一个示例,使用延迟来等待另一个可观察对象,然后再发出您的数据。

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
于 2017-08-31T16:34:08.637 回答