【问题标题】:Room flowable cache房间流动缓存
【发布时间】:2017-10-29 13:17:15
【问题描述】:

我正在使用带有 RX 的 Room (1.0.0.rc1),我的 Dao 是这样定义的:

@Dao
interface AccountDao {
    @Query("SELECT * FROM Account ORDER BY name")
    fun all(): Flowable<List<Account>>
}

我是这样订阅的:

dao
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe { accounts = it }

我在代码中不止一个地方订阅了 flowable。第一个订阅的人得到数据,其他人没有。

如何制作一个 observable,它会在每次有人订阅时发出实际内容,并在数据更改时通知每个订阅者?

【问题讨论】:

    标签: android rx-java rx-android android-room


    【解决方案1】:

    您可以使用replay 在每次有人订阅时发出最新值。并使用distinctUntilChanged 仅在数据更改时通知。

    示例如下:

    import io.reactivex.Observable;
    import io.reactivex.subjects.BehaviorSubject;
    
    public class Q47000608 {
      public static void main(String[] args) {
        BehaviorSubject<Integer> bs = BehaviorSubject.createDefault(1);
        Observable<Integer> o = bs.replay(1).autoConnect().distinctUntilChanged();
        o.subscribe(i -> System.out.println("s1 accept " + i));
        bs.onNext(2);
        o.subscribe(i -> System.out.println("s2 accept " + i));
        o.subscribe(i -> System.out.println("s3 accept " + i));
        bs.onNext(3);
        o.subscribe(i -> System.out.println("s4 accept " + i));
        bs.onNext(4);
      }
    }
    


    并输出:

    s1 accept 1
    s1 accept 2
    s2 accept 2
    s3 accept 2
    s1 accept 3
    s2 accept 3
    s3 accept 3
    s4 accept 3
    s1 accept 4
    s2 accept 4
    s3 accept 4
    s4 accept 4
    

    【讨论】:

    • 谢谢您,先生,我发现问题不在于我的 flowable,但通过您的回答我能够发现它,所以再次感谢 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多