Android效能最佳化之利用Rxlifecycle解決RxJava記憶體流失
前言:
其實RxJava引起的記憶體流失是我無意中發現了,本來是想瞭解Retrofit與RxJava相結合中是如何通過適配器模式解決的,結果卻發現了RxJava是會引起記憶體流失的,所有想著尋找一下資料學習一下如何解決RxJava引起的記憶體流失,就查到了利用Rxlifecycle開源架構可以解決,今天周末就來學習一下如何使用Rxlifecycle。
引用泄漏的背景:
RxJava作為一種響應式編程架構,是目前編程界網紅,可謂是家喻戶曉,其簡潔的編碼風格、易用易讀的鏈式方法調用、強大的非同步支援等使得RxJava被廣泛使用,它通過線程調度器更容易控制和切換線程,如果該背景工作執行緒還沒執行結束就退出Activity或者Fragment,就會Activity或者Fragment無法釋放引起記憶體流失。
什麼是Rxlifecycle。
rxlifecycle是trello開發的用於解決RxJava引起的記憶體流失的開源架構。
github地址:https://github.com/trello/RxLifecycle
如何使用Rxlifecycle。
1.)在build.gradle檔案中添加引用
compile ‘com.trello.rxlifecycle2:rxlifecycle:2.2.1’
// If you want to bind to Android-specific lifecycles
compile ‘com.trello.rxlifecycle2:rxlifecycle-android:2.2.1’
// If you want pre-written Activities and Fragments you can subclass as providers
compile ‘com.trello.rxlifecycle2:rxlifecycle-components:2.2.1’
// If you want pre-written support preference Fragments you can subclass as providers
compile ‘com.trello.rxlifecycle2:rxlifecycle-components-preference:2.2.1’
// If you want to use Navi for providers
compile ‘com.trello.rxlifecycle2:rxlifecycle-navi:2.2.1’
// If you want to use Android Lifecycle for providers
compile ‘com.trello.rxlifecycle2:rxlifecycle-android-lifecycle:2.2.1’
// If you want to use Kotlin syntax
compile ‘com.trello.rxlifecycle2:rxlifecycle-kotlin:2.2.1’
// If you want to use Kotlin syntax with Android Lifecycle
compile ‘com.trello.rxlifecycle2:rxlifecycle-android-lifecycle-kotlin:2.2.1’
2.)根據不同的需要Activity繼承RxActivity ,Fragment繼承RxFragment
public class MainActivity7 extends RxActivity {
private TextView mTextView;
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.text); //類比記憶體泄露 testRxJava(); finish();}private void testRxJava() { Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { int i = 0; while (i < 1000000000) { i++; } subscriber.onNext(String.valueOf(i)); subscriber.onCompleted(); } }).compose(this.<String>bindUntilEvent(ActivityEvent.PAUSE)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String s) { mTextView.setText(s); } });}@Overrideprotected void onDestroy() { super.onDestroy(); LApplication.getRefWatcher().watch(this);}
}
目前支援的Activity/Fragment 結構圖
3.)使用bindToLifecycle()的方式
在子類使用Observable中的compose操作符,調用,完成Observable發布的事件和當前的組件綁定,實現生命週期同步。從而實現當前組件生命週期結束時,自動取消對Observable訂閱。
Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber