我如何知道何时需要在RxJava中处置一次性用品?

时间:2019-04-01 19:31:35

标签: 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

这是我们的UI(Fragments)使用的类,用于跟踪已选择的用户。

但是在更大范围内,我们的代码中有很多地方都使用Rx这样在后台执行某些操作(映射某些内容,网络调用,将数据保存到DB),并且我们并不每次都使用结果。

我可以安全地排除这些错误吗?还是我需要为一次性用品添加处理?

我怎么知道什么时候需要处理一次性用品?

1 个答案:

答案 0 :(得分:1)

尽管案件清单不完整,但我想指出一些我在职业生涯中遇到的问题,可能会对您有所帮助。

我遇到的最常见的情况是,当我们进行网络通话的时间过长并且应用程序被置于后台时。如果不处理,网络的结果将转发给用户。这不是真正的问题。问题在于,通常订户想要更改与UI相关的内容,这会使应用程序崩溃。在这种情况下,您要处分,因为您不再对接收这些事件感兴趣。

在某些情况下,订阅者处理结果的方式不会出现问题,但是IDE无法知道这一点,因此它会一直警告您。

我确定还有很多其他原因需要处理,例如观察对象在订阅时获取资源,并在取消订阅后释放它们。因此,总的来说,我认为处理一次性用品是件好事。当我想一直在后台下载文件并说实话时,我从来不会随意处理这些东西,我什至不确定这是否是一个好习惯。

此外,如果一个可观察物或任何其他风味的可观察物(单个,也许,等等)终止,那么它将被自动处置。