關(guān)于內(nèi)存泄露的文章有很多,比如http://www.reibang.com/p/ac00e370f83d#是比較優(yōu)秀的一篇,這里不再重復(fù)饭豹。
導(dǎo)致內(nèi)存泄露的一個(gè)常見可能原因是銷毀Activity時(shí)尚有耗時(shí)線程沒有結(jié)束。之前公司的網(wǎng)絡(luò)請(qǐng)求操作利用Retrofit+RxJava進(jìn)行了高度封裝,在訪問網(wǎng)絡(luò)時(shí)一般是調(diào)用靜態(tài)方法NetWorks.Post......,在銷毀Activity時(shí)如果仍在訪問網(wǎng)絡(luò)會(huì)導(dǎo)致內(nèi)存泄露。
Android官方RxJava教程的demo中給出了一個(gè)解決這種問題的思路。在RxJava中有多個(gè)subscribe(...)方法可供選擇妥泉,其中部分subscribe()方法會(huì)返回一個(gè)Disposable對(duì)象。該官方demo是MVP結(jié)構(gòu)洞坑,在Presenter類中有一個(gè)CompositeDisposable對(duì)象盲链,該對(duì)象可以通過add(Disposable d)方法添加返回的Disposable對(duì)象,最后在銷毀Activity前調(diào)用CompositeDisposable的clear()方法即可取消訪問检诗。這樣基本上可以避免絕大多數(shù)因?yàn)殚_啟了新線程導(dǎo)致的內(nèi)存現(xiàn)樓問題匈仗。