隨着Android第三庫的普及, RxJava 和 RxAndroid ( https://github.com/ReactiveX/RxAndroid )越來越被人熟知,簡潔的語法,配合Java8 Lambda表達式,使代碼的結構更加清晰,通過線程調度器更容易控制和切換線程,種種優點,使用它的人也越來越多。但是使用不好,很容易導致內存泄露。 Rxlifecycle ( https://github.com/trello/RxLifecycle )就使被用來嚴格控制由於發佈了一個訂閱後,由於沒有及時取消,導致Activity/Fragment無法銷燬導致的內存泄露 。
RxJava和RxAndroid
compile 'io.reactivex:rxandroid:1.0.1' compile 'io.reactivex:rxjava:1.0.16'
Rxlifecycle
compile 'com.trello:rxlifecycle:0.3.0' compile 'com.trello:rxlifecycle-components:0.3.0'
Rxlifecycle 使用
Activity/Fragment需繼承RxAppCompatActivity/RxFragment,目前支持的有RxAppCompatActivity、RxFragment、RxDialogFragment、RxFragmentActivity。
一、bindToLifecycle()方法
在子類使用Observable中的compose操作符,調用,完成Observable發佈的事件和當前的組件綁定,實現生命週期同步。從而實現當前組件生命週期結束時,自動取消對Observable訂閱。
Observable.interval(1, TimeUnit.SECONDS)
.compose(this.bindToLifecycle())
.subscribe(new Action1<Long>() {
@Override
public void call(Long num) {
Log.i(TAG, " " +num);
}
});
二、bindUntilEvent() 方法
使用ActivityEvent類,其中的CREATE、START、 RESUME、PAUSE、STOP、 DESTROY分別對應生命週期內的方法。使用bindUntilEvent指定在哪個生命週期方法調用時取消訂閱。
Observable.interval(1, TimeUnit.SECONDS) .compose(this.bindUntilEvent(ActivityEvent.PAUSE)) .subscribe(mSub);