美文网首页
RxLifecycle使用分析

RxLifecycle使用分析

作者: 听听听说 | 来源:发表于2019-03-20 15:01 被阅读0次

    一、针对的问题
    解决rxjava在页面销毁的时候没有取消订阅的内存泄漏问题。
    比如业务中有接口定时器轮询的功能,之前用timer进行定时实现,在页面销毁的时候不仅要取消timer,还要进行接口的unsubscribe。
    代码如下:

    timer = Timer("POLL_CHECK_LOGIN")
            timer?.schedule(object : TimerTask() {
                override fun run() {
                    checkLogin() 
                }
            }, 2000, 2000)
    

    如果手动取消订阅,则需要在调用时通过CompositeDisposable的.add(disposable) 方法记录,页面销毁时调用CompositeDisposable的clear或者subscription的unsubscribe取消订阅。写法比较复杂,如果使用rxlifecycle就很简单。

    二、使用示例:
    1.添加依赖:
    最新的版本是3.0.0,兼容了androidX,因业务中暂时没做兼容处理,所以还是使用2.2.2版本。

    ```
    implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2'
    ```
    

    不需要再单独添加rxlifecycle和rxlifecycle-android,已经包含在这个jar中了。

    2、基类继承
    如果兼容v4和v7,使用support包下的容器类:


    image.png

    只需要对activity和fragment分别继承RxAppCompatActivity和RxFragement即可。

    3、两种绑定生命周期的方式

    public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull ActivityEvent event) {
          return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
      }
    
      public final <T> LifecycleTransformer<T> bindToLifecycle() {
            return RxLifecycleAndroid.bindActivity(lifecycleSubject);
        }
    

    第一种可以指定在哪个生命周期取消订阅,传入参数为ActivityEvent ,枚举对应activity的各个生命周期:

    public enum ActivityEvent {
    
        CREATE,
        START,
        RESUME,
        PAUSE,
        STOP,
        DESTROY
    
    }
    

    第二种则自动对应取消订阅的生命周期,比如在onCreate方法里调用,则会自动在onDestroy中取消。
    onResume则对应onPause。

    定时接口轮询使用示例:

     Observable.interval(2,2,TimeUnit.SECONDS).compose(bindToLifecycle()).subscribe {
                checkLogin()
            }
    

    三、缺点分析
    参考文章:https://blog.danlew.net/2017/08/02/why-not-rxlifecycle/
    1、当在没有生命周期的组件中使用时,比如在adapter中使用Observable,就需要在activity正确的生命周期中去处理Observable和取消订阅。但是在adapter中没有办法去获取对应的生命周期,使用起来稍显麻烦。
    2、rxlifecycle并不能解决所有的订阅问题,还有其他与生命周期无关的场景需要手动去取消订阅。
    3、不支持Single/Completablex。
    rxlifecycle通过onComplete()结束Stream,我们只能在Stream的末尾去使用Rxlifecycle,但是onComplete()和unsubscription之间是有差异的。

    image.png
    4、降低了RxLint的功能,不能检测是否处理onError()的lint规则。

    相关文章

      网友评论

          本文标题:RxLifecycle使用分析

          本文链接:https://www.haomeiwen.com/subject/sqizmqtx.html