AutoDispose使用

前言

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é)到:

  1. AutoDispose的使用
  2. Android Studio Profiler 內(nèi)存泄漏分析
  3. 推薦一個可以快速開發(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來檢測呢?


profiler.png

點(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,日志還在打印。


未使用AutoDispose的內(nèi)存圖.png

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


使用了AutoDispose的內(nèi)存圖.png

同樣的操作,這就很明顯了。使用了AutoDispose后,內(nèi)存里已經(jīng)找不到SecondActivity的內(nèi)存了。這表明,AutoDispose起了作用。

附上

AutoDispose:https://github.com/uber/AutoDispose
demo(也是一個簡單的快速開發(fā)庫):https://github.com/twangithub/TwanBase

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容