咱們在使用rxjava請求網絡的時候,會出現一種狀況,當咱們訂閱後,activity銷燬了,這個時候咱們的activity就沒法被收回,從而引起形成內存泄漏,對此咱們可使用RxLifecycle來管理activity的生命週期,是用步驟很簡單,就三步,依賴、繼承、綁定。java
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();
}
}
複製代碼
咱們使用compose操做符來綁定其生命週期,這裏咱們使用bash
compose((RxAppCompatActivity)context.bindUntilEvent(ActivityEvent.STOP))
複製代碼
compose(baseApi.getActivity().bindToLifecycle())
複製代碼
在說綁定原理以前首先提兩個東西,網絡
調用bindUntilEvent方法時,會傳入兩個參數,一個是BehaviorSubject,一個是咱們設定的ActivityEvent,這裏的BehaviorSubject上面說了是在訂閱的時候將數據發送出去,BehaviorSubject在activity的時候會調用onNext將生命週期傳入進去 ide
再跟入bindUntilEvent方法,咱們能夠看到他執行了一個bind方法,而且bing方法中作了一個處理,去判斷當前的生命週期與咱們傳入的生命週期是否相等,若是不相等,則不會將值發送到Subscriberspa
總結一下bindUntilEvent的生命週期綁定原理:就是運用到BehaviorSubject和takeUntil,當BehaviorSubject發送出來的生命週期與咱們傳入的生命週期相等的時候則取消訂閱,不相等,則不取消,是否相等在過濾器(filter)中處理的code
根據當前的生命週期,來進行運算獲得一個新的序列,這個序列爲boolean序列,當爲true的時候則取消訂閱,核心方法爲takeUntilCorrespondingEvent方法中的combineLatest combineLatest參數component
lifecycle.take(1)指的是最近發射的事件orm
這裏就是指ACTIVITY_LIFECYCLE中對應的參數,若是當前生命週期爲create,則返回的是ActivityEvent.DESTROYcdn
lifecycle.skip(1)指除去第一個保留剩下的
這裏就是指咱們除去咱們當前的生命週期,剩下的,例如咱們當前處於create中執行了bindToLifecycle,則六個生命週期中就去除掉create,剩下的五個
第三個參數 意味着,lifecycle.take(1).map(correspondingEvents)的序列和 lifecycle.skip(1)進行combine,造成一個新的序列
咱們用ACTIVITY_LIFECYCLE中獲得的對應的參數去與咱們第二個參數中的獲得的剩下的生命週期序列作比較,而後獲得一串Boolean序列,當爲true的時候則取消訂閱