在 Android / Java 中使用 RxJava 时,内存泄漏最常见的根源是:订阅(Subscription / Disposable)没有被及时取消,导致 Activity / Fragment 被持有而无法回收。
下面从「原因 → 解决方案 → 最佳实践」系统讲一下。
Observable.interval(1, TimeUnit.SECONDS)
.subscribe(t -> updateUI());
如果 Activity 销毁了但没 dispose(),这个流会一直持有 Activity。
observable.subscribe(new Observer<T>() {
void onNext(T t) {
activityField.xxx();
}
});
匿名内部类 隐式持有外部类(Activity)。
CompositeDisposable compositeDisposable = new CompositeDisposable();
Disposable d = observable.subscribe(...);
compositeDisposable.add(d);
@Override
protected void onDestroy() {
compositeDisposable.clear(); // 或 dispose()
}
✅ clear():可复用
✅ dispose():不可复用
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:xxx'
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(viewLifecycleOwner, Observer { })
或使用:
observable
.compose(bindUntilEvent(ActivityEvent.DESTROY))
.subscribe(...)
observable
.as(autoDispose(this))
.subscribe(...)
DisposableObserverDisposableObserver<T> observer = new DisposableObserver<T>() {
@Override public void onNext(T t) {}
@Override public void onError(Throwable e) {}
@Override public void onComplete() {}
};
observable.subscribeWith(observer);
// 销毁时
observer.dispose();
❌ 错误
.subscribe(data -> textView.setText(data));
✅ 正确
.subscribe(data -> {
if (!isFinishing()) {
textView.setText(data);
}
});
或使用 viewLifecycleOwner
lifecycleScope 替代 RxJava(官方趋势)lifecycleScope.launch {
flow.collect { updateUI(it) }
}
或使用 repeatOnLifecycle
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.data.collect { }
}
}
RxJava 内存泄漏 = 订阅未取消 + 生命周期未绑定
✅ 核心解决办法:
CompositeDisposableCoroutine + Flow如果你愿意,可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。