【问题标题】:RxJava Filter is ignoredRxJava 过滤器被忽略
【发布时间】:2018-08-24 06:41:57
【问题描述】:

在我的班级Activity 中,我创建了一个Fragment。为了检测片段是否准备好,我的片段中有一个布尔标志isInitialized。现在我想在我的活动中运行一些代码,为此我必须确保片段已准备好并且isInitialized 为真。现在我写了一些 RxJava 代码来对 Activity 中变量的变化做出反应

Observable.just(fragment.isInitialized)
            .filter { _ -> true }
            .subscribe {  load() }

如果我运行我的应用程序,即使 isInitialized 为 false,也会始终调用 load 方法。我的代码有什么问题?

【问题讨论】:

  • 如果isInitialized 是一个字段,您无法对它的更改做出这样的反应。使用BehaviorSubject<Boolean> isInitialized
  • 嗯,好的。有道理。您能否发布一个代码示例。我是这个主题的新手。
  • 将布尔值更改为 BehaviorSubject

标签: android android-activity fragment rx-java2


【解决方案1】:

如果isInitialized 是一个基本字段,您不能对它的更改做出这样的反应。请改用BehaviorSubject<Boolean>

在您的片段中:

BehaviorSubject<Boolean> isInitialized = BehaviorSubject.create();

在你的初始化代码中的某处:

isInitialized.onNext(true);

在您的加载代码中:

fragment.isInitialized
        .filter { _ -> true }
        .observeOn(Schedulers.io())
        .doOnNext { load() }
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe { /* loaded */ }

【讨论】:

  • 这太棒了。像魅力一样工作。非常感谢!
  • 过滤器真的很有必要,主题只是他们推送一个事件,值没有任何后果,特别是所有工作都在副作用运算符中完成。
  • 可能不是真的有必要,除非 OP 想把 false 变成别的意思。
  • 如果我将过滤器设置为 false,为什么这不起作用fragment.isInitialized .filter { _ -&gt; false } .observeOn(Schedulers.io()) .doOnNext { load() } .observeOn(AndroidSchedulers.mainThread()) .subscribe { /* loaded */ }
  • 假设我想在 Fragment 被破坏的情况下做一些事情,所以我将 fragment.isInitialized 设置为 false 并在我的 Activity 中做出反应
【解决方案2】:

假设 isInitialized 是一个布尔值,您需要对值进行过滤。目前,您对每个条件都返回 true。

filter { it }

【讨论】:

  • 感谢您的回答。我已将代码更改为Observable.just(fragment.isInitialized) .filter { it } .subscribe { load() } 但现在即使变量isInitialized 为真,该方法也不会被调用
  • Observable.just 将在调用时发出 isInitialized 的值 - 如果这是 false 它将永远不会发出。如果您想在值更改时做出反应,您可能希望 isInitialized 成为一个可观察值。
  • 是的,这正是我所需要的。如何使用 RxJava 实现这一点?
  • 可能最简单的方法是使用主题,例如reactivex.io/RxJava/javadoc/rx/subjects/BehaviorSubject.html - 然后你会在主题上调用 onNext 以在它发生变化时发出新值。
猜你喜欢
  • 2021-11-04
  • 1970-01-01
  • 2020-11-07
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
相关资源
最近更新 更多