异步事件内存泄漏:基于rxjava2,前提框架不做任何改动
异步事件内存泄漏:方案1:rxlifecycle2:无法解决自定义类里生命周期绑定当前 框架不适用,或者如果改动需要在BaseView层加接口,BaseAcvitiy加方法,改动影响大如果是themvp正好适用方案2:autoDispose:可参考的项目很少目前能搜索的项目,很多都是错误引用LifecycleOwner,或者引用的SupportActivity中的Lifecycle如果投入更多时间
异步事件内存泄漏:
方案1:
rxlifecycle2:
- 无法解决自定义类里生命周期绑定
- 当前 框架不适用,或者如果改动需要在BaseView层加接口,BaseAcvitiy加方法,改动影响大
- 如果是themvp正好适用
方案2:
autoDispose:
- 可参考的项目很少
- 目前能搜索的项目,很多都是错误引用LifecycleOwner,或者引用的SupportActivity中的Lifecycle
- 如果投入更多时间适配autoDispose
- 生命周期onpause,onstop无法检测到,性能无法达到最优
参考:
//示例1
https://github.com/leaderliang/MvpPractice
//示例2
https://github.com/hnhzy/WanAndroid
//示例3
https://github.com/RookieExaminer/MvpDemo
//示例4
https://github.com/enChenging/MVP_Template
//示例5
https://github.com/GongWnbo/RxJava2Retrofit2Mvp
//官方github
https://github.com/uber/AutoDispose
//官方文档
https://uber.github.io/AutoDispose/
综合:都不适用,只使用rxjava的dipose
解决方案:
单个异步事件:
Disposable subscribe = Observable.empty().subscribe();
if (!subscribe.isDisposed()) {
//异步事件或者clear()
subscribe.dispose();
}
多个异步事件:
private CompositeDisposable compositeDisposable = new CompositeDisposable();
Disposable subscribe = Observable.empty().subscribe();
if (!subscribe.isDisposed()) {
//异步事件或者clear()
subscribe.dispose();
}
compositeDisposable.add(subscribe);
if (!compositeDisposable.isDisposed()){
compositeDisposable.dispose();
}
其中问题:
//The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the exception has nowhere to go to begin with
//解决方案1:在 Application 初始化时候设置 RxJavaPlugin 的 ErrorHandler
//RxJava2的一个重要的设计理念是:不吃掉任何一个异常。产生的问题是,当RxJava2“downStream”取消订阅后,“upStream”仍有可能抛出异常,这时由于已经取消订阅,“downStream”无法处理异常,此时的异常无人处理,便会导致程序崩溃。
RxJavaPlugins.setErrorHandler(new Consumer() {
@Override
public void accept(Throwable throwable) throws Exception {
System.out.println(“err:” + throwable.getMessage());
}
});
参考:
RxJava2.0 使用过程中遇到的 bug 总结
https://www.dazhuanlan.com/2019/10/01/5d933966217a9/
RxJava操作符(五)Error Handling
https://mushuichuan.com/2015/12/11/rxjava-operator-5/
更多推荐



所有评论(0)