变化倾听者的境界发生了变化

时间:2016-05-23 13:20:07

标签: android loops triggers realm rx-java

我尝试使用带有Rx的Realm复制数据库触发器功能。一旦我发出RealmList,我会用它做一些事情并保存。遗憾的是,这导致Realm的更改侦听器再次被执行,一遍又一遍地发出列表。

虚拟例子:

categoryName

一旦我在订阅者中提交了事务,新的RealmList就会从observable中发出。我知道为什么会发生这种情况,我只是没有办法解决这个问题。

这引出了我的问题。有没有办法如何使用领域复制触发器功能,我将进行任何领域更改?

1 个答案:

答案 0 :(得分:0)

可以使用辅助流来构建变通方法,确定是否应该使用db中的下一个项目。每个数据存储到db都应该伴随写入帮助器流。下面的运行测试得出:

upstream: IgnoreAction{action='start', ignoreNext=false}   
result: 1   
result: 2   
result: 3   
upstream: IgnoreAction{action='1', ignoreNext=true}   
upstream: IgnoreAction{action='2', ignoreNext=true}   
upstream: IgnoreAction{action='3', ignoreNext=true}    

因此,第一个数据(" start")被消耗,onNext中触发的写入被忽略。

@Test
public void rxIgnore() throws Exception {

MockDb mockDb = new MockDb();

BehaviorSubject<Boolean> ignoreNextStream = BehaviorSubject.create(false);
Observable<String> dataStream = mockDb.dataSource();

dataStream.zipWith(ignoreNextStream, Data::new)
        .doOnNext(action -> System.out.println("upstream: " + action))
        .filter(Data::isTakeNext)
        .flatMap(__ -> Observable.just(1, 2, 3))
        .subscribe(new Observer<Integer>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Integer val) {
                System.out.println("result: " + val);
                ignoreNextStream.onNext(true);
                mockDb.data(String.valueOf(val));
            }
        });

mockDb.data("start");

Observable.empty().delay(1, TimeUnit.MINUTES).toBlocking().subscribe();
}

private static class Data {
private final String action;
private final boolean ignoreNext;

public Data(String action, boolean ignoreNext) {
    this.action = action;
    this.ignoreNext = ignoreNext;
}

public boolean isTakeNext() {
    return !ignoreNext;
}

@Override
public String toString() {
    return "IgnoreAction{" +
            "action='" + action + '\'' +
            ", ignoreNext=" + ignoreNext +
            '}';
}
}

private static class MockDb {

private final Subject<String, String> subj = PublishSubject.<String>create()
                                            .toSerialized();

public void data(String action) {
    subj.onNext(action);
}

Observable<String> dataSource() {
    return subj;
}
}