Android-在 ViewModel 中使用 AutoDispose2 解決 RxJava 的內存泄露問題

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

在這裏插入圖片描述

解決方案

這裏僅介紹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

參考

本文同步分享在 博客「_龍衣」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。函數

相關文章
相關標籤/搜索