美文网首页
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使用分析

    一、针对的问题解决rxjava在页面销毁的时候没有取消订阅的内存泄漏问题。比如业务中有接口定时器轮询的功能,之前用...

  • RxLifecycle

    RxLifecycle用来解决由于rxjava可能造成的内存泄露,未使用RxLifecycle时:使用rxjava...

  • RxLifecycle

    为什么要用Rxlifecycle 。使用Rxlifecycle的原因? 解决RxJava使用中的内存泄漏问题。例如...

  • 为什么不使用 RxLifecycle?

    本文为翻译文章,原文连接:为什么不使用RxLifecycle Why Not RxLifecycle? Hello...

  • RxLifecycle原理分析

    RxLifecycle源码地址 RxLifecycle有两种使用方法:1、bindToLifecycle直接绑定生...

  • RxLifecycle使用和源码分析

    RxJava内存泄漏 为什么RxJava会发生内存泄漏?​ 在当前页面用RxJava发布订阅后,如果当期页面fin...

  • Rxlifecycle使用

    随着Android第三库的普及,RxJava和RxAndroid(https://github.com/React...

  • Rxlifecycle使用详解

    随着Android第三库的普及,RxJava和RxAndroid(https://github.com/React...

  • TODO 最适合练习主流框架的应用

    1、应用介绍: 使用MVP+Dagger2+Retrofit+Rxjava2+RxLifecycle+ARoute...

  • 有关Android Lifecycle的一些事

    这是一篇关于AutoDispose/RxLifecycle/Google Lifecycle的详细分析,以做记录。...

网友评论

      本文标题:RxLifecycle使用分析

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