RxJava2使用过程中遇到的坑

来源:互联网 发布:unity3d卡牌游戏技能 编辑:程序博客网 时间:2024/05/16 09:36

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

原创粉丝点击