其實RxJava引發的內存泄漏是我無心中發現了,原本是想了解Retrofit與RxJava相結合中是如何經過適配器模式解決的,結果卻發現了RxJava是會引發內存泄漏的,全部想着查找一下資料學習一下如何解決RxJava引發的內存泄漏,就查到了利用Rxlifecycle開源框架能夠解決,今天週末就來學習一下如何使用Rxlifecycle。android
RxJava做爲一種響應式編程框架,是目前編程界網紅,可謂是家喻戶曉,其簡潔的編碼風格、易用易讀的鏈式方法調用、強大的異步支持等使得RxJava被普遍使用,它經過線程調度器更容易控制和切換線程,若是該工做線程還沒執行結束就退出Activity或者Fragment,就會Activity或者Fragment沒法釋放引發內存泄漏。git
rxlifecycle是trello開發的用於解決RxJava引發的內存泄漏的開源框架。github
github地址:https://github.com/trello/RxLifecycle編程
compile 'com.trello:rxlifecycle:1.0'
// If you want to bind to Android-specific lifecycles
compile 'com.trello:rxlifecycle-android:1.0'
// If you want pre-written Activities and Fragments you can subclass as providers
compile 'com.trello:rxlifecycle-components:1.0'
// If you want to use Navi for providers
compile 'com.trello:rxlifecycle-navi:1.0'
// If you want to use Kotlin syntax
compile 'com.trello:rxlifecycle-kotlin:1.0'
根據本身的須要添加 我這裏使用了以下兩個框架
compile 'com.trello:rxlifecycle:1.0'
compile 'com.trello:rxlifecycle-components:1.0'
public class MainActivity7 extends RxActivity { private TextView mTextView; @Override protected 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); } }); } @Override protected void onDestroy() { super.onDestroy(); LApplication.getRefWatcher().watch(this); } }
目前支持的Activity/Fragment 結構圖異步
在子類使用Observable中的compose操做符,調用,完成Observable發佈的事件和當前的組件綁定,實現生命週期同步。從而實現當前組件生命週期結束時,自動取消對Observable訂閱。ide
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>bindToLifecycle()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String s) { mTextView.setText(s); } });
使用ActivityEvent類,其中的CREATE、START、 RESUME、PAUSE、STOP、 DESTROY分別對應生命週期內的方法。使用bindUntilEvent指定在哪一個生命週期方法調用時取消訂閱。學習
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); } });
只須要你想要的Activity實現LifecycleProvider<ActivityEvent>接口就能夠了,這裏貼出RxActivity的源碼仿照它作下修改便可。gradle
public abstract class RxActivity extends Activity implements LifecycleProvider<ActivityEvent> { private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create(); public RxActivity() { } @NonNull @CheckResult public final Observable<ActivityEvent> lifecycle() { return this.lifecycleSubject.asObservable(); } @NonNull @CheckResult public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull ActivityEvent event) { return RxLifecycle.bindUntilEvent(this.lifecycleSubject, event); } @NonNull @CheckResult public final <T> LifecycleTransformer<T> bindToLifecycle() { return RxLifecycleAndroid.bindActivity(this.lifecycleSubject); } @CallSuper protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.lifecycleSubject.onNext(ActivityEvent.CREATE); } @CallSuper protected void onStart() { super.onStart(); this.lifecycleSubject.onNext(ActivityEvent.START); } @CallSuper protected void onResume() { super.onResume(); this.lifecycleSubject.onNext(ActivityEvent.RESUME); } @CallSuper protected void onPause() { this.lifecycleSubject.onNext(ActivityEvent.PAUSE); super.onPause(); } @CallSuper protected void onStop() { this.lifecycleSubject.onNext(ActivityEvent.STOP); super.onStop(); } @CallSuper protected void onDestroy() { this.lifecycleSubject.onNext(ActivityEvent.DESTROY); super.onDestroy(); } }
本文總結了經過RxLifeCycle解決RxJava的內存泄漏問題,同時也給咱們提了一個警告,再好的框架都有它好的一面也有壞的一面,這時作好技術選型以及規避風險就很重要了。ui