Код
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
НО just(author)
вызывается из instance-reference .
Я хочу выполнить эту операцию только одним запросом. Я могу сделать разные наблюдаемые для каждого и выполнить желаемую операцию, но это займет много времени.
Почему?
Поступая так, SonarQube
дает мне неудачную проверку и вынуждает меня удалить instance-reference .
Любые альтернативы будут оценены.
2 ответа
Здесь нет причин использовать 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();
}
Вы пытаетесь использовать just()
в качестве оператора, когда это действительно наблюдаемое. Похоже, вы намерены использовать переданный в author
ряд запросов, а затем проверить, что все книги, связанные с автором, "изменились".
Кроме того, вы пытаетесь вернуть логическое значение, которое, вероятно, не было установлено к моменту возврата. Вам может потребоваться заблокировать и дождаться завершения цепочки наблюдателей, если вы хотите получить значение. Скорее всего, вы хотите, чтобы цепочка наблюдателей завершилась, если какая-либо книга изменилась.
Кроме того, последовательность шагов, на которых вы устанавливаете флаг в истинное значение, сводится к установке флага на 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();
Похожие вопросы
Новые вопросы
android
Android - это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфоны, планшеты, автомобили, телевизоры, одежда, стекло, IoT). Для тем, связанных с Android, используйте специальные теги Android, такие как android-intent, android-activity, android-адаптер и т. Д. Для вопросов, не связанных с разработкой или программированием, но связанных с платформой Android, используйте эту ссылку: https: // android.stackexchange.com .