为什么要用Rxlifecycle 。使用Rxlifecycle的原因?
解决RxJava使用中的内存泄漏问题。例如,当使用RxJava订阅并执行耗时任务后,当Activity被finish时,如果耗时任务还未完成,没有及时取消订阅,就会导致Activity无法被回收,从而引发内存泄漏。
怎么用?
1.添加依赖
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.1'
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.1'
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.1'
2.继承容器类
Activity/Fragment需要继承RxAppCompatActivity/RxFragment,主要支持如下几种容器类:
![](https://img.haomeiwen.com/i3985563/eac32af7d5a0bb31.png)
只需要在项目中针对base类的容器中继承实现对应的Rx类即可,这一步主要是对生命周期的回调事件进行监听。
3.绑定容器生命周期
以Activity为例,主要有如下两种方法:
bindUntilEvent(@NonNullActivityEventevent)
bindToLifecycle()
针对Fragment也有同样的两种方法,只是方法名会有所不同。
下面详细介绍这两种方法的区别:
bindUntilEvent
该方法指定在哪个生命周期方法调用时取消订阅。
其中ActivityEvent是一个枚举类,对应于Activity的生命周期。
publicenumActivityEvent{CREATE,START,RESUME,PAUSE,STOP,DESTROY}
具体使用示例:
overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)Observable.interval(1,TimeUnit.SECONDS).doOnDispose{Log.i(TAG,"Unsubscribing subscription from onDestory()")}.compose(bindUntilEvent(ActivityEvent.DESTROY)).subscribe{Log.i(TAG,"Started in onCreate(), running until in onDestroy():$it")}}
指定在生命周期onDestory()时,取消订阅。
bindToLifecycle
在某个生命周期进行绑定,在对应的生命周期进行订阅解除。
具体使用示例:
overridefunonResume(){super.onResume()
Observable.interval(1,TimeUnit.SECONDS).doOnDispose{Log.i(TAG,"Unsubscribing subscription from onPause()")}.compose(bindToLifecycle()).subscribe{Log.i(TAG,"Started in onResume(), running until in onPause():$it")
}}
在onResume()进行绑定订阅,则在onPause()进行解除订阅,生命周期是两两对应的。
网友评论