RxLifecycle使用分析

一、针对的问题
解决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  LifecycleTransformer bindUntilEvent(@NonNull ActivityEvent event) {
      return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
  }
  public final  LifecycleTransformer 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使用分析)