天天看點

RxLifecycle使用 解決Rxjava程式設計的記憶體洩露問題

RxLifecycle是什麼?

This library allows one to automatically complete sequences based on a second lifecycle stream.

This capability is useful in Android, where incomplete subscriptions can cause memory leaks.
           

通俗的說:可以通過綁定生命周期的方式,來解決記憶體洩漏的問題

開源位址

rxlifecycle是trello開發的用于解決RxJava引起的記憶體洩漏的開源架構。傳送門

Android studio中的依賴與使用

1.)在build.gradle檔案中添加依賴

// RxLifecycle基礎庫
compile 'com.trello.rxlifecycle2:rxlifecycle:2.1.0'
// Android元件庫,裡面定義了例如RxAppCompatActivity、RxFragment之類的Android元件
compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'
           

2.)根據不同的需要Activity繼承RxActivity ,Fragment繼承RxFragment

public class MainActivity7 extends RxActivity {
    private TextView mTextView;
    private static final String TAG = "RxLifecycle";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.text);
        Observable.interval(, TimeUnit.SECONDS)
            .doOnUnsubscribe(new Action0() {
                @Override
                public void call() {
                    Log.i(TAG, "Unsubscribing subscription from onCreate()");
                }
            })
            .subscribe(new Action1<Long>() {
                @Override
                public void call(Long num) {
                    Log.i(TAG, "Started in onCreate(), running until onPause(): " + num);
                }
            });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}
           

當activity對象被銷毀,而我們的在rxjava中執行一些耗時的操作(例如:網絡通路–>成功擷取資料–>重新整理UI;檔案的存儲等),就會造成記憶體洩露的現象。

3.)使用bindToLifecycle()的方式 —->綁定生命周期,自動取消訂閱

完成Observable釋出的事件和目前的元件綁定,實作生命周期同步。進而實作目前元件生命周期結束時,自動取消對Observable訂閱。

Observable.interval(, TimeUnit.SECONDS)
            .doOnUnsubscribe(new Action0() {
                @Override
                public void call() {
                    Log.i(TAG, "Unsubscribing subscription from onCreate()");
                }
            })
            //Note:bindToLifecycle的自動取消訂閱示例,因為是在onStart的時候調用,是以在onStop的時候自動取消訂閱
            .compose(this.<Long>bindToLifecycle())
            .subscribe(new Action1<Long>() {
                @Override
                public void call(Long num) {
                    Log.i(TAG, "Started in onCreate(), running until onPause(): " + num);
                }
            });
    }
           

4.)使用bindUntilEvent()方式—>手動設定取消訂閱的時機

使用CREATE、START、 RESUME、PAUSE、STOP、 DESTROY分别對應生命周期内的方法。使用bindUntilEvent指定在哪個生命周期方法調用時取消訂閱。

Observable.interval(, TimeUnit.SECONDS)
            .doOnUnsubscribe(new Action0() {
                @Override
                public void call() {
                    Log.i(TAG, "Unsubscribing subscription from onCreate()");
                }
            })
            //Note:bindUntilEvent手動設定在activity onDestroy的時候取消訂閱
            .compose(this.<Long>bindUntilEvent(ActivityEvent.DESTROY))
            .subscribe(new Action1<Long>() {
                @Override
                public void call(Long num) {
                    Log.i(TAG, "Started in onCreate(), running until onPause(): " + num);
                }
            });
    }
           

參考:RxAndroid之Rxlifecycle使用