隨著Android第三庫(kù)的普及,RxJava和RxAndroid(https://github.com/ReactiveX/RxAndroid)越來(lái)越被人熟知,簡(jiǎn)潔的語(yǔ)法,配合Java8 Lambda表達(dá)式,使代碼的結(jié)構(gòu)更加清晰,通過(guò)線(xiàn)程調(diào)度器更容易控制和切換線(xiàn)程,種種優(yōu)點(diǎn),使用它的人也越來(lái)越多。但是使用不好,很容易導(dǎo)致內(nèi)存泄露。Rxlifecycle (https://github.com/trello/RxLifecycle)就使被用來(lái)嚴(yán)格控制由于發(fā)布了一個(gè)訂閱后,由于沒(méi)有及時(shí)取消,導(dǎo)致Activity/Fragment無(wú)法銷(xiāo)毀導(dǎo)致的內(nèi)存泄露。
RxJava和RxAndroid
? ?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()方法
在子類(lèi)使用Observable中的compose操作符,調(diào)用,完成Observable發(fā)布的事件和當(dāng)前的組件綁定,實(shí)現(xiàn)生命周期同步。從而實(shí)現(xiàn)當(dāng)前組件生命周期結(jié)束時(shí),自動(dòng)取消對(duì)Observable訂閱。
Observable.interval(1, TimeUnit.SECONDS)? ? ? ? ? ? ? ?
.compose(this.bindToLifecycle())
.subscribe(new Action1() {
@Override
public void call(Long num) {
Log.i(TAG, "? " + num);
}
});
二、bindUntilEvent()方法
使用ActivityEvent類(lèi),其中的CREATE、START、 RESUME、PAUSE、STOP、 DESTROY分別對(duì)應(yīng)生命周期內(nèi)的方法。使用bindUntilEvent指定在哪個(gè)生命周期方法調(diào)用時(shí)取消訂閱。
Observable.interval(1,TimeUnit.SECONDS)?
.compose(this.bindUntilEvent(ActivityEvent.PAUSE))
.subscribe(mSub);