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使用