房间可流动的缓存

时间:2017-10-29 13:17:15

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

我正在使用Room(1.0.0.rc1)和RX,我的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。订阅的第一个获取数据,其他的不是。

如何制作一个可以在每次有人订阅时发出实际内容的可观察数据,并且还会在数据发生变化时通知每个订阅者?

1 个答案:

答案 0 :(得分:2)

每次有人订阅时,您都可以使用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