#android #rx-java2
#Android #rx-java2
Вопрос:
Пытаюсь понять RxJava здесь. У нас есть этот код:
public void notifyNewOwnersSynced() {
OrgTreeType orgTreeType = getOrgTreeType();
new OrgTreeQuerier().queryOrgUserIds().byOrgTreeType(orgTreeType).executeAsync()
.map(opt -> opt.isPresent() ? opt.get() : new HashSet<String>(0))
.subscribe(
this::onNewOrgUserIds,
e -> Log.exception(new Exception("Unable to update selected id filter for type " orgTreeType, e))
);
}
private void onNewOrgUserIds(@NonNull Set<String> allIds) {
synchronized (mLock) {
for (String id : allIds) {
if (!mPreviousAllIds.contains(id)) {
mSelectedIDs.add(id);
}
}
Set<String> idsNoLongerInHierarchy = new HashSet<>(); //Because we can't remove while we are iterating.
for (String selectedId : mSelectedIDs) {
//If there is a selected ID not in the new hierarchy...
if (!allIds.contains(selectedId)) {
//Plan to remove it.
idsNoLongerInHierarchy.add(selectedId);
}
}
mSelectedIDs.removeAll(idsNoLongerInHierarchy);
mPreviousAllIds = allIds;
}
mSaveListener.saveChangesAndPostFilterChangedEvent();
postSelectedIdsChangedEvent();
}
На нем отображаются два предупреждения о ворсе: The result of subscribe is not used.
и Result of single.subscribe() is ignored
Это класс, который используется нашим пользовательским интерфейсом (фрагменты) для отслеживания того, какие пользователи были выбраны.
Но в более широком масштабе у нас есть много мест в нашем коде, которые используют Rx, подобный этому, для выполнения чего-либо в фоновом режиме (сопоставление чего-либо, сетевой вызов, сохранение данных в БД), и мы не все используем результат.
Могу ли я безопасно подавить эти ошибки? или мне нужно добавить обработку для одноразовых?
Как я могу узнать, когда мне нужно избавиться от одноразового?
Ответ №1:
Хотя это не полный список случаев, я думаю, что могу указать на некоторые, с которыми я сталкивался за свою карьеру, и мог бы помочь вам.
Наиболее распространенный сценарий, с которым я столкнулся, был, когда мы выполняем сетевые вызовы, которые занимают слишком много времени, и приложение переводится в фоновый режим. Если не удалено, результат сети будет отправлен подписчику. На самом деле это не проблема. Проблема в том, что обычно подписчик хочет изменить что-то, связанное с пользовательским интерфейсом, что приводит к сбою приложения. В этом случае вы удаляете, потому что вы больше не заинтересованы в получении этих событий.
Бывают случаи, когда способ, которым подписчик обрабатывает результат, не будет проблематичным, но у IDE нет способа узнать это и, следовательно, он постоянно предупреждает вас.
Я уверен, что есть множество других причин, по которым следует обрабатывать удаление — т. Е. Когда наблюдаемые объекты получают ресурсы при подписке и освобождают их после отмены подписки. Итак, в целом, я думаю, что хорошо обращаться с одноразовыми. Я только когда-либо оставлял одноразовый файл нераспакованным, когда хотел продолжать загружать файлы в фоновом режиме, и, честно говоря, я даже не уверен, что это хорошая практика.
Добавляя к этому, если наблюдаемый или любой из других приправленных наблюдаемых (возможно, одиночный и т.д.) завершается, он удаляется автоматически.