向 CompositeDisposable 添加大量 Disposable 的潜在危害
Potential hazards of adding lots of Disposables to a CompositeDisposable
当浏览大量讨论 Android MVVM 架构与 RxJava 2 的文章时(例如 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()
)一个新的disposable将被添加到CompositeDisposable
变量disposables
。
在这种情况下可能不会有什么大不了的,但我可以想象在某些其他情况下,链接到 CompositeDisposables
的 Disposables
的数量可能 运行高达数千或更多。
这被认为是一种好的或安全的做法吗?
假设 CompositeDisposable
中的每个订阅都完成,随着时间的推移只会有少量内存泄漏。
如果您担心它,您应该可以在 loadGreeting()
中提前创建一次性用品。添加一个 doOnUnsubscribe()
操作,该操作将从 CompositeDisposable()
.
中删除一次性用品
当浏览大量讨论 Android MVVM 架构与 RxJava 2 的文章时(例如 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()
)一个新的disposable将被添加到CompositeDisposable
变量disposables
。
在这种情况下可能不会有什么大不了的,但我可以想象在某些其他情况下,链接到 CompositeDisposables
的 Disposables
的数量可能 运行高达数千或更多。
这被认为是一种好的或安全的做法吗?
假设 CompositeDisposable
中的每个订阅都完成,随着时间的推移只会有少量内存泄漏。
如果您担心它,您应该可以在 loadGreeting()
中提前创建一次性用品。添加一个 doOnUnsubscribe()
操作,该操作将从 CompositeDisposable()
.