Rxjava2生命週期綁定

    咱們在使用rxjava請求網絡的時候,會出現一種狀況,當咱們訂閱後,activity銷燬了,這個時候咱們的activity就沒法被收回,從而引起形成內存泄漏,對此咱們可使用RxLifecycle來管理activity的生命週期,是用步驟很簡單,就三步,依賴、繼承、綁定。java

使用步驟

依賴RxLifecycle

compile 'com.trello.rxlifecycle2:rxlifecycle:2.2.1'
    compile 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.1'
    compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.1'
複製代碼

繼承

繼承RxAppCompatActivity或RxFragmentActivity等等,fragment也提供了相應的繼承類android

public class BaseActivity extends RxAppCompatActivity {


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}
複製代碼

綁定Activity

咱們使用compose操做符來綁定其生命週期,這裏咱們使用bash

  1. 使用bindUntilEvent綁定,傳入的參數有六種,對應activity的生命週期, CREATE, START, RESUME, PAUSE, STOP, DESTROY,咱們想讓其在何時取消訂閱就傳入對應的生命週期就行了,如如下例子爲當生命週期處於stop的時候,取消訂閱
compose((RxAppCompatActivity)context.bindUntilEvent(ActivityEvent.STOP))
複製代碼
  1. 使用bindToLifecycle方法綁定,這種方法跟隨者activity的生命週期,當activity銷燬的時候取消訂閱
compose(baseApi.getActivity().bindToLifecycle())
複製代碼

綁定原理

在說綁定原理以前首先提兩個東西,網絡

  1. BehaviorSubject,這個Subject是官方提供的,做用是「釋放訂閱前最後一個數據和訂閱後接收到的全部數據」,簡單的說,他就是onNext來存儲數據,而後在訂閱的時候將數據發送出去。這個類暫時理解到這。
  2. takeUntil操做符,「當第二個Observable發射了一項數據或者終止時,丟棄原Observable發射的任何數據」。這個說明白一點就是當收到某個observable的某個事件時,自動取消訂閱(某個observable就是BehaviorSubject)

bindUntilEvent綁定原理

    調用bindUntilEvent方法時,會傳入兩個參數,一個是BehaviorSubject,一個是咱們設定的ActivityEvent,這裏的BehaviorSubject上面說了是在訂閱的時候將數據發送出去,BehaviorSubject在activity的時候會調用onNext將生命週期傳入進去 ide

在這裏插入圖片描述
在這裏插入圖片描述

    再跟入bindUntilEvent方法,咱們能夠看到他執行了一個bind方法,而且bing方法中作了一個處理,去判斷當前的生命週期與咱們傳入的生命週期是否相等,若是不相等,則不會將值發送到Subscriberspa

在這裏插入圖片描述
    在bind方法中,建立了一個LifecycleTransformer而且傳入observable,在LifecycleTransformer的構造中將這個observable存儲爲成員,用於takeUnti方法的執行(該方法的做用上面說了,若是observable發送了值過來就會自動取消訂閱)

    總結一下bindUntilEvent的生命週期綁定原理:就是運用到BehaviorSubject和takeUntil,當BehaviorSubject發送出來的生命週期與咱們傳入的生命週期相等的時候則取消訂閱,不相等,則不取消,是否相等在過濾器(filter)中處理的code

bindToLifecycle綁定原理

    根據當前的生命週期,來進行運算獲得一個新的序列,這個序列爲boolean序列,當爲true的時候則取消訂閱,核心方法爲takeUntilCorrespondingEvent方法中的combineLatest combineLatest參數component

  1. lifecycle.take(1)指的是最近發射的事件orm

    這裏就是指ACTIVITY_LIFECYCLE中對應的參數,若是當前生命週期爲create,則返回的是ActivityEvent.DESTROYcdn

  2. lifecycle.skip(1)指除去第一個保留剩下的

    這裏就是指咱們除去咱們當前的生命週期,剩下的,例如咱們當前處於create中執行了bindToLifecycle,則六個生命週期中就去除掉create,剩下的五個

  3. 第三個參數 意味着,lifecycle.take(1).map(correspondingEvents)的序列和 lifecycle.skip(1)進行combine,造成一個新的序列

    咱們用ACTIVITY_LIFECYCLE中獲得的對應的參數去與咱們第二個參數中的獲得的剩下的生命週期序列作比較,而後獲得一串Boolean序列,當爲true的時候則取消訂閱

在這裏插入圖片描述

在這裏插入圖片描述
相關文章
相關標籤/搜索