前言
RxJava已經(jīng)深入民心,即使沒用過也聽說過了小作,真沒用過的話看看我的其他文章有介紹亭姥。但是RxJava使用不當會導致內(nèi)存泄漏,真的是很蛋疼啊顾稀,就不能再完美點嗎达罗。那有沒有好的解決方式呢?目前來說可以手動管理去掉訂閱,也可以采用RxLifecycle來管理粮揉。采用RxLifycycle來管理的話,需要繼承RxActivity / RxFragment侨拦,我覺得這框架就有點侵入式了狱从,一直以來我都是手動管理叠纹,但是也不爽〉跬荩現(xiàn)在冒窍,有一個新的庫综液,AutoDispose可以完美的解決這種問題了儒飒。
環(huán)境準備
Android Studio 3.1.4
閱讀本文你將學到:
- AutoDispose的使用
- Android Studio Profiler 內(nèi)存泄漏分析
- 推薦一個可以快速開發(fā)的庫桩了,開箱即用
正文
引入AutoDispose:compile 'com.uber.autodispose:autodispose-android-archcomponents:1.0.0-RC2'
為了演示RxJava2的內(nèi)存泄漏,我就隨便復制了一段很流行的RxJava代碼蕉扮。Demo邏輯很簡單,在MainActivity里有個按鈕喳钟,點擊跳轉(zhuǎn)到SecondActivity奔则,并在oncreat()里放入以下代碼:
Observable.interval(1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
//AutoDispose的使用就是這句
①//.as(AutoDispose.<Long>autoDisposable(AndroidLifecycleScopeProvider.from(this)))
.subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Long aLong) {
Log.i("接收數(shù)據(jù),當前線程"+Thread.currentThread().getName(), String.valueOf(aLong));
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
一開始把標為①的那行注釋掉,來觸發(fā)內(nèi)存泄漏疾呻。那怎么用AS的profiler來檢測呢?
點擊這個圖標啟動app,選擇你的手機年缎,對應包名单芜,雙擊MEMORY視圖洲鸠,然后點擊Main的按鈕啟動Second 3次扒腕。其實此時不打開profiler內(nèi)存分析萤悴,通過lagcat的日志就能看出內(nèi)存泄漏了覆履,因為關(guān)閉了SecondActivity硝全,日志還在打印伟众。
一圖勝千言赂鲤,正常來說数初,主動觸發(fā)GC泡孩,沒用的內(nèi)存會被系統(tǒng)清理掉,但是第一步我們就觸發(fā)了GC吮播,結(jié)果第四步還能搜出SecondActivity的內(nèi)存意狠,這就表明泄漏了环戈。
好了,現(xiàn)在我們把標為①的那行注釋去掉遮晚,同樣啟動profiler來觀察:
同樣的操作,這就很明顯了萧求。使用了AutoDispose后饭聚,內(nèi)存里已經(jīng)找不到SecondActivity的內(nèi)存了。這表明箕速,AutoDispose起了作用盐茎。
附上
AutoDispose:https://github.com/uber/AutoDispose
demo(也是一個簡單的快速開發(fā)庫):https://github.com/twangithub/TwanBase