阅读许多有关使用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中。

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

这是一种良好或安全的做法吗?

最佳答案

假设CompositeDisposable中的每个订阅都完成了,那么随着时间的流逝只有少量的内存泄漏。

如果您对此有所担心,则应该可以提前在loadGreeting()中创建一次性对象。添加一个doOnUnsubscribe()操作,该操作将从CompositeDisposable()中删除一次性对象。

10-08 17:15