Rxlifecycle使用詳解,解決RxJava內存泄露問題

隨着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);
發佈了6 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章