流过滤直到另一个流发出,但在第二个流发出后重新发送这些过滤的发射

时间:2017-08-31 13:34:24

标签: rx-java rx-java2 reactive-streams

我有一股Foo。 Foo发出需要布局Android视图(宽度和高度> 0)。我使用RxBinding,即

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

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

当这个可观察的视图发出(或完成,视图中的视图)视图时。

我需要的是fooObservable()等到RxView发出,即视图布局。我不能只是fooObservable.filter(宽度&&高度> 0),因为它会丢弃发射。 我需要的是让foo的最后一个发出缓存(如果视图没有布局)并在第一个RxView.preDraws之后重新发送。,如果它已经布局,它应该正常通过

2 个答案:

答案 0 :(得分:2)

您可以使用delaydelaySubsription。有些表格会延迟发出或订阅,直到另一个观察者发出一些东西。在第一种情况下,您将只有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