https://blog.youkuaiyun.com/sr_code_plus/article/details/77189478
1. 初始化RxJava回收执行周期
背景:RxJava开启一个循环线程在后台默默回收Publisher,默认是1秒循环一次,但是这样比较耗费cpu,纯净后台检测时,cpu唤醒率无法达到标准。
解决方案:设置垃圾检测回收周期为1小时。
/**
* 初始化RxJava回收执行的周期
* @see io.reactivex.internal.schedulers.SchedulerPoolFactory
*/
private static void initRxPurgeProperties() {
System.setProperty(PURGE_ENABLED_KEY, "true");
System.setProperty(PURGE_PERIOD_SECONDS_KEY, "3600");
}
2. RxJava2 取消订阅后,抛出的异常无法捕获,导致程序崩溃
背景:RxJava2的一个重要的设计理念是:不吃掉任何一个异常。产生的问题是,当RxJava2“downStream”取消订阅后,“upStream”仍有可能抛出异常,这时由于已经取消订阅,“downStream”无法处理异常,此时的异常无人处理,便会导致程序崩溃。
示例代码:
mDisposable = Flowable("token")
.map(new Function<String, Object>() {
@Override
public List<Objeect> apply(String token) throws Exception {
//...
//code A
throw new InterceptorIOException("io error");//throw exception when mDisposable.isCanceled()
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Objeect>() {
@Override
public void accept(Objeect data) throws Exception {
// do something when success
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
//do something when error!
//code B
//注意:当mDisposable.isCanceled()时抛出的异常,这里不会补货,因为已经取消了订阅
}
});
- 上述代码code A出抛出的异常code B处无法捕获,便会导致程序崩溃。
解决方案:在Application设置RxJavaPlugin的ErrorHandler
/**
* RxJava2 当取消订阅后(dispose()),RxJava抛出的异常后续无法接收(此时后台线程仍在跑,可能会抛出IO等异常),全部由RxJavaPlugin接收,需要提前设置ErrorHandler
* 详情:http://engineering.rallyhealth.com/mobile/rxjava/reactive/2017/03/15/migrating-to-rxjava-2.html#Error Handling
*/
private void setRxJavaErrorHandler() {
RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
BLogger.d(TAG, "throw test");
}
});
}
参考文献
https://getpocket.com/a/read/1799392578
http://engineering.rallyhealth.com/mobile/rxjava/reactive/2017/03/15/migrating-to-rxjava-2.html