RxJava2使用过程中遇到的坑

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() {
        @Override
        public List 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() {
         @Override
         public void accept(Objeect data) throws Exception {
              // do something when success
         }     
     }, new Consumer() {
          @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() {
       @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

你可能感兴趣的:(杂记,RxJava)