【问题标题】:Manually trigger a RxJava combinelatest flowable手动触发 RxJava combinelatest flowable
【发布时间】:2017-10-20 16:33:23
【问题描述】:

所以我有一个场景,我想结合两个 flowables 的最新结果并用它做一些事情。

Flowable.combineLatest(
                info,
                list,
                BiFunction  {  ... }
        )

在某些情况下,我需要能够再次获得结果,并做一些与以前不同的事情。所以我可以在某处手动存储 combinelatest 的结果,然后重复使用它们,但我在想,也许有一种方法可以添加第三个 flowable,并手动触发 onNext,以便再次传播结果。这可能吗?

【问题讨论】:

    标签: android rx-java2 combinelatest


    【解决方案1】:

    有两种方法可以保留计算值以供以后使用。您可以创建一个 BehaviorSubject 作为中间变量,定义后将具有计算值,或者您可以 publish() observable 以便新订阅者获得最新结果。

    BehaviorSubject intermediateResult = BehaviorSubject.create();

    Flowable.combineLatest(info, list, ...)
      .subscribe( intermediateResult );
    

    或者,

    Observable<Type> intermediateResult = Flowable.combineLatest(info, list, ...)
      .replay(1)
      .publish();
    

    在任何一种情况下,订阅intermediateResult 都会获得最新的计算值(如果存在)。

    编辑:动态选择功能:

    Observable<FunctionSelector> fnSelector;
    
    Observable<Type> intermediateResult = 
      Flowable.combineLatest(info, list, fnSelector, 
         (information, listToUse, selector) -> 
           getFunction(selector).apply(information, listToUse))
      .replay(1)
      .publish(1);
    

    【讨论】:

    • 我不想要缓存。我需要能够在需要时获得两个流动的组合结果。 BiFunction 受外部变量影响
    • 如果您需要更改函数,那么您可能希望将外部变量绑定到可观察对象,并将其作为链的输入。我会尽快修改我的答案。
    • 会像这样创建第三个可流动的作品:? stackoverflow.com/questions/42428472/…@BobDalgleish
    • 你真的不需要像那样创建一个 observable。只需使用带有初始值的 BehaviorSubject,并通过调用 onNext() 来更新它。
    猜你喜欢
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多