RxJava在单个订户中观察多个观察者

时间:2018-01-01 10:02:23

标签: android sonarqube rx-java rx-java2 sonarlint

代码

Author author = baseRealm.where(Author.class).equalTo("id", mId).findFirst();

public boolean checkGlobalSyncStatus(Author author, List<Books> mBooks) {

    final boolean[] isJobSynchronized = {false};

    Observable.fromIterable(mBooks)
            .filter(Books::isChanged)
            .doOnNext(book -> isJobSynchronized[0] = true)
            .just(author)
            .flatMapIterable(Author::getAllBooks)
            .filter(MyBook::isChanged)
            .doOnNext(mBook -> isJobSynchronized[0] = true)
            .just(author)
            .flatMapIterable(Author::getAllWriters)
            .filter(Writers::isChanged)
            .doOnNext(jobPage -> isJobSynchronized[0] = true)
            .subscribe();

    return isJobSynchronized[0];
}

问题

fromIterable(mBooks)来自静态参考 Observable <{strong> just(author)来自 instance-reference

我只想在单个查询中完成此操作。我可以为每个人做出不同的观察并执行所需的操作,但这将是漫长的。

为什么吗

通过这样做,SonarQube给了我不成功的检查并强制我删除 instance-reference

任何替代方案都将受到赞赏。

Lint analysis

2 个答案:

答案 0 :(得分:1)

当它真的是一个可观察的时候,你试图使用just()作为运算符。您的意图似乎是使用传入的author进行一系列查询,然后检查与作者关联的任何图书是否已更改&#34;。

此外,您尝试返回一个布尔值,该值可能在返回发生时未设置。如果需要值,可能需要阻塞并等待观察链完成。更有可能的是,如果任何书籍已经更改,您希望观察者链完成。

此外,将标志设置为true的一系列步骤归结为第一次将标志设置为true

使用just()将原始作者重新绑定到观察者链中,而不是map()。使用toBlocking()运算符使流程同步。

Observable.fromIterable(mBooks)
        .filter(Books::isChanged)
        .toBlocking()
        .subscribe( ignored -> isJobSynchronized[0] = true );

return isJobSynchronized[0];

由于(可能)异步查询不再需要计算值,因此删除RxJava:

return mBooks.stream()
         .filter(Books::isChanged)
         .anyMatch();

答案 1 :(得分:0)

这里没有理由使用RxJava,但运营商的正确组合如下:

Author author = baseRealm.where(Author.class).equalTo("id", mId).findFirst();

public boolean checkGlobalSyncStatus(Author author, List<Books> mBooks) {

    return Single.concat(
                Observable.fromIterable(mBooks)
                .any(Books::isChanged)
                , // ---------------------------------------------
                Observable.fromIterable(author.getAllBooks)
                .any(MyBook::isChanged)
                , // ---------------------------------------------
                Observable.fromIterable(author.getAllWriters)
                .any(Writers::isChanged)
           )
           .any(bool -> bool)
           .blockingGet();
}