【问题标题】:Potential hazards of adding lots of Disposables to a CompositeDisposable向 CompositeDisposable 添加大量 Disposable 的潜在危害
【发布时间】:2018-05-12 08:43:44
【问题描述】:

在浏览大量讨论使用 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()) 一个新的disposable会被添加到CompositeDisposable变量disposables

在这种情况下,这可能不是什么大问题,但我可以想象,在其他一些情况下,链接到 CompositeDisposablesDisposables 的数量可能会达到数千甚至更多。

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

【问题讨论】:

  • RxJava 2 Extensions 项目最近添加了工具,可以自动从CompositeDisposables 中删除已完成的消费者。

标签: android mvvm rx-java rx-java2


【解决方案1】:

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

如果您对此感到担忧,您应该可以在loadGreeting() 中提前创建一次性用品。添加一个doOnUnsubscribe() 操作,该操作将从CompositeDisposable() 中删除一次性用品。

【讨论】:

    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2016-07-22
    • 2011-11-09
    • 1970-01-01
    • 2021-04-10
    • 2019-10-14
    相关资源
    最近更新 更多