RxJava2使用过程中遇到的问题

https://blog.csdn.net/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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值