尝试在此处了解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),并且我们并不每次都使用结果。
我可以安全地排除这些错误吗?还是我需要为一次性用品添加处理?
我怎么知道什么时候需要处理一次性用品?
答案 0 :(得分:1)
尽管案件清单不完整,但我想指出一些我在职业生涯中遇到的问题,可能会对您有所帮助。
我遇到的最常见的情况是,当我们进行网络通话的时间过长并且应用程序被置于后台时。如果不处理,网络的结果将转发给用户。这不是真正的问题。问题在于,通常订户想要更改与UI相关的内容,这会使应用程序崩溃。在这种情况下,您要处分,因为您不再对接收这些事件感兴趣。
在某些情况下,订阅者处理结果的方式不会出现问题,但是IDE无法知道这一点,因此它会一直警告您。
我确定还有很多其他原因需要处理,例如观察对象在订阅时获取资源,并在取消订阅后释放它们。因此,总的来说,我认为处理一次性用品是件好事。当我想一直在后台下载文件并说实话时,我从来不会随意处理这些东西,我什至不确定这是否是一个好习惯。
此外,如果一个可观察物或任何其他风味的可观察物(单个,也许,等等)终止,那么它将被自动处置。