Как я могу узнать, когда мне нужно избавиться от одноразового в RxJava?

#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 нет способа узнать это и, следовательно, он постоянно предупреждает вас.

Я уверен, что есть множество других причин, по которым следует обрабатывать удаление — т. Е. Когда наблюдаемые объекты получают ресурсы при подписке и освобождают их после отмены подписки. Итак, в целом, я думаю, что хорошо обращаться с одноразовыми. Я только когда-либо оставлял одноразовый файл нераспакованным, когда хотел продолжать загружать файлы в фоновом режиме, и, честно говоря, я даже не уверен, что это хорошая практика.

Добавляя к этому, если наблюдаемый или любой из других приправленных наблюдаемых (возможно, одиночный и т.д.) завершается, он удаляется автоматически.