异步事件内存泄漏:
方案1:
rxlifecycle2:

  1. 无法解决自定义类里生命周期绑定
  2. 当前 框架不适用,或者如果改动需要在BaseView层加接口,BaseAcvitiy加方法,改动影响大
  3. 如果是themvp正好适用

方案2:
autoDispose:

  1. 可参考的项目很少
  2. 目前能搜索的项目,很多都是错误引用LifecycleOwner,或者引用的SupportActivity中的Lifecycle
  3. 如果投入更多时间适配autoDispose
  4. 生命周期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/

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐