RxLifecycle

2020-12-09  本文已影响0人  赖益文

为什么要用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,主要支持如下几种容器类:

只需要在项目中针对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()进行解除订阅,生命周期是两两对应的。

上一篇下一篇

猜你喜欢

热点阅读