前言
RxJava已經(jīng)深入民心,即使沒用過也聽說過了,真沒用過的話看看我的其他文章有介紹。但是RxJava使用不當(dāng)會導(dǎo)致內(nèi)存泄漏,真的是很蛋疼啊,就不能再完美點(diǎn)嗎。那有沒有好的解決方式呢?目前來說可以手動管理去掉訂閱,也可以采用RxLifecycle來管理。采用RxLifycycle來管理的話,需要繼承RxActivity / RxFragment,我覺得這框架就有點(diǎn)侵入式了,一直以來我都是手動管理,但是也不爽?,F(xiàn)在,有一個新的庫,AutoDispose可以完美的解決這種問題了。
環(huán)境準(zhǔn)備
Android Studio 3.1.4
閱讀本文你將學(xué)到:
- AutoDispose的使用
- Android Studio Profiler 內(nèi)存泄漏分析
- 推薦一個可以快速開發(fā)的庫,開箱即用
正文
引入AutoDispose:compile 'com.uber.autodispose:autodispose-android-archcomponents:1.0.0-RC2'
為了演示RxJava2的內(nèi)存泄漏,我就隨便復(fù)制了一段很流行的RxJava代碼。Demo邏輯很簡單,在MainActivity里有個按鈕,點(diǎn)擊跳轉(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ù),當(dāng)前線程"+Thread.currentThread().getName(), String.valueOf(aLong));
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
一開始把標(biāo)為①的那行注釋掉,來觸發(fā)內(nèi)存泄漏。那怎么用AS的profiler來檢測呢?

點(diǎn)擊這個圖標(biāo)啟動app,選擇你的手機(jī),對應(yīng)包名,雙擊MEMORY視圖,然后點(diǎn)擊Main的按鈕啟動Second 3次。其實(shí)此時不打開profiler內(nèi)存分析,通過lagcat的日志就能看出內(nèi)存泄漏了,因?yàn)殛P(guān)閉了SecondActivity,日志還在打印。

一圖勝千言,正常來說,主動觸發(fā)GC,沒用的內(nèi)存會被系統(tǒng)清理掉,但是第一步我們就觸發(fā)了GC,結(jié)果第四步還能搜出SecondActivity的內(nèi)存,這就表明泄漏了。
好了,現(xiàn)在我們把標(biāo)為①的那行注釋去掉,同樣啟動profiler來觀察:

同樣的操作,這就很明顯了。使用了AutoDispose后,內(nèi)存里已經(jīng)找不到SecondActivity的內(nèi)存了。這表明,AutoDispose起了作用。
附上
AutoDispose:https://github.com/uber/AutoDispose
demo(也是一個簡單的快速開發(fā)庫):https://github.com/twangithub/TwanBase