阅读许多有关使用RxJava 2的Android MVVM架构的文章(例如this article)时,您经常会看到类似以下内容的内容:
class LobbyViewModel extends ViewModel {
...
void loadCommonGreeting() {
loadGreeting(loadCommonGreetingUseCase.execute());
}
void loadLobbyGreeting() {
loadGreeting(loadLobbyGreetingUseCase.execute());
}
MutableLiveData<Response<String>> getResponse() {
return response;
}
MutableLiveData<Boolean> getLoadingStatus() {
return loadingStatus;
}
private void loadGreeting(Single<String> single) {
disposables.add(single
.subscribeOn(schedulersFacade.io())
.observeOn(schedulersFacade.ui())
.doOnSubscribe(s -> loadingStatus.setValue(true))
.doAfterTerminate(() -> loadingStatus.setValue(false))
.subscribe(
greeting -> response.setValue(Response.success(greeting)),
throwable -> response.setValue(Response.error(throwable))
)
);
}
查看以上内容的逻辑时,您会看到每次用户触发操作(
loadCommonGreeting()
/loadLobbyGreeting()
)时,都会将新的一次性使用项添加到CompositeDisposable
变量disposables
中。在这种情况下,这可能不是什么大问题,但是我可以想象,在其他情况下,链接到
Disposables
的CompositeDisposables
的数量可能达到数千甚至更多。这是一种良好或安全的做法吗?
最佳答案
假设CompositeDisposable
中的每个订阅都完成了,那么随着时间的流逝只有少量的内存泄漏。
如果您对此有所担心,则应该可以提前在loadGreeting()
中创建一次性对象。添加一个doOnUnsubscribe()
操作,该操作将从CompositeDisposable()
中删除一次性对象。