RxJava 的內存泄露問題
runRxLambda 和 runRxLambdaViewModel 只是個擴展函數,能夠不用理會,下面兩段代碼惟一的區別就是第二段增長了
AndroidLifecycleScopeProvider.from(view)
,這也致使了第二段代碼不會出現內存泄露,而第一段代碼會出現內存泄露。java
runRxLambda(Observable.intervalRange(0,100,1,1,TimeUnit.SECONDS),{ Log.e("222","runRxLambda-time:$it") },{ },{ }) // 只處理成功,失敗的能夠處理能夠不處理 runRxLambdaViewModel(AndroidLifecycleScopeProvider.from(view),Observable.intervalRange(0,100,1,1,TimeUnit.SECONDS),{ Log.e("222","runRxLambdaViewModel-time:$it") mElapsedRealTime.postValue(it) })
下面的日誌對應的操做流程是:跳轉一個頁面後點擊一個按鈕,執行上面的兩段代碼,而後當即返回上一個頁面。android
經過日誌也能夠看出第一段代碼內存泄露了吧,頁面都已經關閉可是相關的邏輯代碼還在執行。這就是 RxJava
使用中常見的內存泄露問題。git
解決方案
- 在 onSubscribe(d: Disposable) 回調中保存 dispose ,在頁面關閉的時候調用
.dispose()
方法 - 使用
RxLifeCycle
, 地址:https://github.com/trello/RxLifecycle - 使用
AutoDispose
, 地址:https://uber.github.io/AutoDispose/#overview
這裏僅介紹AutoDispose2
的使用github
AutoDispose2
- 引入依賴
implementation 'com.uber.autodispose2:autodispose-android:2.0.0' implementation 'com.uber.autodispose2:autodispose-androidx-lifecycle:2.0.0'
- AutoDispose 解決的問題:
AutoDispose是一種RxJava 2+工具,用於經過處置/取消將RxJava流的執行自動綁定到提供的做用域。一般(尤爲是在移動應用程序中),Rx訂閱須要中止以響應某些事件(例如,在Android應用程序中執行Activity#onStop()時)。爲了支持RxJava 2中的這種常見狀況,咱們構建了AutoDispose。web
在 Activity 和 Fragment 中使用
- 解決辦法僞代碼以下:
myObservable .doStuff() .as(autoDisposable(this)) // The magic .subscribe(s -> ...);
只要這樣一行as(autoDisposable(this))
,您將按照做用域指示自動取消訂閱myObservable
, 這有助於防止在Observable
發出項目時出現許多錯誤類別。架構
在 ViewModel 或者 Presenter 中使用
// 構造函數注入 LifecycleOwner,而後在 activity 或者fragment 中傳入 this 參數便可。 class MineViewModel(val view:LifecycleOwner) : BaseViewModel() { private val mElapsedRealTime = MutableLiveData<Long>() val countDownTime: MutableLiveData<Long> by lazy { mElapsedRealTime } /** * 開啓倒計時 * 加入這一行:AndroidLifecycleScopeProvider.from(view) */ fun getTime(){ // 只處理成功,失敗的能夠處理能夠不處理 runRxLambdaViewModel(AndroidLifecycleScopeProvider.from(view), Observable.intervalRange(0,100,1,1,TimeUnit.SECONDS),{ mElapsedRealTime.postValue(it) }) } }
runRxLambdaViewModel
的代碼沒啥,主要是使用 kotlin 的擴展函數和高階函數封裝了RxJava
線程切換的代碼。ide
源碼地址:https://github.com/YGragon/FrameDemosvg
參考
- AutoDispose 官網
- Android架構中添加AutoDispose解決RxJava內存泄漏
- ViewModel 概覽
- AutoDispose使用
- AutoDispose解決RxJava內存泄漏(Android)
本文同步分享在 博客「_龍衣」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。函數