android - RxJava 在单个订阅者中观察多个观察者

标签 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)static-reference Observable BUT just(author) 调用instance-reference 调用。

我只想在单个查询中完成此操作。我可以为每个对象创建不同的可观察对象并执行所需的操作,但这会很长。

为什么?

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

任何替代方案将不胜感激。


Lint analysis

最佳答案

just() 确实是可观察的时,您正试图将其用作运算符。看起来您的 Intent 是使用传入的 author 进行一系列查询,然后检查与作者关联的任何书籍是否已“更改”。

此外,您正在尝试返回一个 bool 值,该值在返回发生时可能尚未设置。如果您想要该值,您可能需要阻塞并等待观察者链完成。更有可能的是,您希望观察者链在任何书发生变化时结束。

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

代替just(),使用map()将原作者重新绑定(bind)到观察者链中。使用 toBlocking() 运算符使进程同步。

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

return isJobSynchronized[0];

由于(大概)异步查询不再需要计算值,删除 RxJava:

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

关于android - RxJava 在单个订阅者中观察多个观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48048723/

相关文章:

sonarqube - SonarQube 中的质量门故障不会使 Teamcity 中的构建失败

android - RxJava + Retrofit 2 链接 API 请求

java - 当前 Android 时间(纳秒)

Android更改中文和繁体中文的语言环境不起作用

sonarqube - 为什么SonarQube分析成功了却不显示结果?

java - rxjava : Can I use retry() but with delay?

java - 正确终止卡住的 Couchbase Observable

java - Android NDK/一般 JNI 问题 : Converting object/jobject to c++ user defiend type

android - android View 转换动画列表?

java - VSCode SonarQube 支持 Visual Studio Code 错误 400