向 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

在这种情况下可能不会有什么大不了的,但我可以想象在某些其他情况下,链接到 CompositeDisposablesDisposables 的数量可能 运行高达数千或更多。

这被认为是一种好的或安全的做法吗?

假设 CompositeDisposable 中的每个订阅都完成,随着时间的推移只会有少量内存泄漏。

如果您担心它,您应该可以在 loadGreeting() 中提前创建一次性用品。添加一个 doOnUnsubscribe() 操作,该操作将从 CompositeDisposable().

中删除一次性用品