Android 第三方库RxLifecycle使用
1.簡(jiǎn)單介紹RxLifecycle
1.1.使用原因。
在使用rxjava的時(shí)候,如果沒(méi)有及時(shí)解除訂閱,在退出activity的時(shí)候,異步線程還在執(zhí)行。
對(duì)activity還存在引用,此時(shí)就會(huì)產(chǎn)生內(nèi)存泄漏。
RxLifecycle就是為了解決rxjava導(dǎo)致的內(nèi)存泄漏而產(chǎn)生的。
?
?
1.2.RxLifecycle可以做到什么呢?
它可以讓Observable發(fā)布的事件和當(dāng)前的組件綁定,實(shí)現(xiàn)生命周期同步。
從而實(shí)現(xiàn)當(dāng)前組件生命周期結(jié)束時(shí),自動(dòng)取消對(duì)Observable訂閱。
核心思想:通過(guò)監(jiān)聽Activity、Fragment的生命周期,來(lái)自動(dòng)斷開訂閱防止內(nèi)存泄漏。
?
1.3.參考文獻(xiàn)。
RxAndroid的github地址:https://github.com/ReactiveX/RxAndroid
Rxlifecycle的github地址:https://github.com/trello/RxLifecycle
參考文章:Rxlifecycle使用詳解。
參考文章:在mvp中使用rxlifecycle避免rxjava的內(nèi)存泄漏。
?
2.使用方法
2.1.添加最新的依賴
//rxjava的依賴 compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.1.7' //rxlifecycle的依賴 compile 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle-kotlin:2.2.1'?
?
2.2.Activity以及Fragment的繼承
Activity需要繼承RxAppCompatActivity。==>比如這么一個(gè)類
public class BaseActivity extends RxAppCompatActivityFragment需要繼承RxFragment。==>比如這么一個(gè)類
public abstract class BaseFragment<T extends IBasePresenter>extends RxFragmentimplements IBaseView<T>?
?
2.3.綁定生命周期。
自己寫一個(gè)接口,里面定義一個(gè)bindToLife()函數(shù)。
/*** 綁定生命周期*/<T> LifecycleTransformer<T> bindToLife();這個(gè)bindToLife()是自定義的名字,這里就叫做bindToLife好了。
這個(gè)接口是自己定義的一個(gè)接口,我讓Fragment來(lái)繼承這個(gè)接口。
這個(gè)返回的是一個(gè)LifecycleTransformer<T>,這個(gè)官方的一個(gè)類。而且這里使用了泛型,更加通用了。
?
?
2.4.在自己的Fragment中實(shí)現(xiàn)這個(gè)接口函數(shù)。
/*** 綁定生命周期*/@Overridepublic <T> LifecycleTransformer<T> bindToLife() {return bindUntilEvent(FragmentEvent.DESTROY);}這里調(diào)用了官方的一個(gè)bindUntilEvent的方法,以此函數(shù)來(lái)綁定生命周期。
這里的FragmentEvent.DESTROY,顧名思義,就是當(dāng)Fragment銷毀的時(shí)候,自動(dòng)解除訂閱關(guān)系。
注意:這里使用了FragmentEvent類,其中的CREATE/START/RESUME/PAUSE/STOP/DESTROY
? ? 分布對(duì)應(yīng)生命周期內(nèi)的方法。使用bindUntilEvent指定在哪個(gè)生命周期方法調(diào)用示取消訂閱。
?
?
2.5.在請(qǐng)求API函數(shù)的時(shí)候,執(zhí)行自己寫的bindToLife()
? ?調(diào)用Observable<T>.compose(執(zhí)行接口中的bindToLife())
compose里面的東西應(yīng)該是:LifecycleTransformer<T>。
?
3.對(duì)于Rxlifecycle的理解
3.1.使用原因就不用多說(shuō)了,解決RxJava導(dǎo)致的內(nèi)存泄漏。
?
?
3.2.因?yàn)閍ctivity和fragment控制切換線程的時(shí)候,引用沒(méi)有清除干凈,所以就把手腳著重于activity和fragment的
生命周期了,就是說(shuō),如果你的活動(dòng)如果碰到意外或者用戶主動(dòng)銷毀,那么也斷開訂閱,就是訂閱的生命周期
和活動(dòng)的生命周期已經(jīng)融為一體了,那就不用擔(dān)心再發(fā)生內(nèi)存泄漏了,所以這種綁定生命周期的方法是從根本
上解決了內(nèi)存泄漏。感覺(jué)沒(méi)有更好的方法解決了。
?
?
3.3.其實(shí)官方為了兩種解決方案。
一種是手動(dòng)取消訂閱,我不知道怎么用,也沒(méi)有實(shí)戰(zhàn)過(guò)。
這里提供一下大神的文章:RxAndroid之Rxlifecycle使用。
手動(dòng)設(shè)置在activity onPause的時(shí)候取消訂閱。
private static final String TAG = "RxLifecycle";@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG, "onCreate()");setContentView(R.layout.activity_main);Observable.interval(1, TimeUnit.SECONDS).doOnUnsubscribe(new Action0() {@Overridepublic void call() {Log.i(TAG, "Unsubscribing subscription from onCreate()");}})//Note:手動(dòng)設(shè)置在activity onPause的時(shí)候取消訂閱.compose(this.<Long>bindUntilEvent(ActivityEvent.PAUSE)).subscribe(new Action1<Long>() {@Overridepublic void call(Long num) {Log.i(TAG, "Started in onCreate(), running until onPause(): " + num);}}); }?
手動(dòng)設(shè)置在activity的onDestroy的時(shí)候取消訂閱。
@Override protected void onResume() {super.onResume();Log.d(TAG, "onResume()");// `this.<Long>` is necessary if you're compiling on JDK7 or below.// If you're using JDK8+, then you can safely remove it.Observable.interval(1, TimeUnit.SECONDS).doOnUnsubscribe(new Action0() {@Overridepublic void call() {Log.i(TAG, "Unsubscribing subscription from onResume()");}})//Note:手動(dòng)設(shè)置在activity onDestroy的時(shí)候取消訂閱.compose(this.<Long>bindUntilEvent(ActivityEvent.DESTROY)).subscribe(new Action1<Long>() {@Overridepublic void call(Long num) {Log.i(TAG, "Started in onResume(), running until in onDestroy(): " + num);}}); }?
自動(dòng)設(shè)置取消訂閱,默認(rèn)在onStart的時(shí)候調(diào)用,在onStop的時(shí)候取消訂閱。
@Override protected void onStart() {super.onStart();Log.d(TAG, "onStart()");// Using automatic unsubscription, this should determine that the correct time to// unsubscribe is onStop (the opposite of onStart).Observable.interval(1, TimeUnit.SECONDS).doOnUnsubscribe(new Action0() {@Overridepublic void call() {Log.i(TAG, "Unsubscribing subscription from onStart()");}})//Note:bindToLifecycle的自動(dòng)取消訂閱示例,因?yàn)槭窃趏nStart的時(shí)候調(diào)用,所以在onStop的時(shí)候自動(dòng)取消訂閱.compose(this.<Long>bindToLifecycle()).subscribe(new Action1<Long>() {@Overridepublic void call(Long num) {Log.i(TAG, "Started in onStart(), running until in onStop(): " + num);}}); }?
轉(zhuǎn)載于:https://www.cnblogs.com/Jason-Jan/p/8016850.html
總結(jié)
以上是生活随笔為你收集整理的Android 第三方库RxLifecycle使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python数据处理与机器学习
- 下一篇: Software--Architectu