原本以為android內存泄露會是大牛才該解決的問題。可是公司就我一個Android啊,代碼都是你寫的啊,工具持續用一個小時就開始卡頓了,甚至崩潰,你不解決誰解決啊。
于是乎,開始查什么叫內存泄露,內存溢出。看了一大堆文章不是我想要的。從解決結果來說,程序中存在不合理的代碼,比如handler,計時器,注冊的服務廣播什么的沒關閉,導致activity關閉的時候,資源沒有被系統回收,內存沒有被釋放,反復操作,內存占用越來越多,知道逼近系統分配給你應用的最大內存,程序開始卡頓,直至崩潰。
那么接下來有幾個問題,問題1,一般應用在android studio中的memory應該是多少呢,我測試我的軟件是啟動8M多一點,打開兩三個界面后到16M左右,設備是專用測量設備南方x2,然后打開內存泄露那個界面,關閉后到達20M,反復打開關閉,最終好像有40M,不過我也沒耐心測試一個小時,既然知道了這里內存異常了。附as查看應用占用內存情況
然后,開始百度搜索(用百度會不會被用google的鄙視)如何解決內存溢出。最終鎖定leakcanary。gradle引用
debugCompile'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
releaseCompile'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
application中添加
private RefWatcher mRefWatcher;
public voidonCreate() {
mRefWatcher= LeakCanary.install(this);
}
public static RefWatcher getRefWatcher(Context context){
MyApplication baseApplication = (MyApplication) context.getApplicationContext();
return baseApplication.mRefWatcher;
}
然后在BaseAcitivity(沒有封裝一層直接在每個activity中)的ondestroy中添加MyApplication.getRefWatcher(this).watch(this);
然后運行程序就好了,當關閉activity時有內存泄露的話,屏幕上會有個彈窗提示,然后可以去系統通知欄查看。或者你會發現你多了一個應用程序leaks,打開后發現
然后發現一個activity4.5M內存泄露,驚不驚喜,意不意外,年幼無知的我還不知道4.5M是什么概念,直到我測試出別的界面有內存泄露,不過是100K,13k的時候,我才意識到這個4.5M,真尼瑪大啊。然后看錯誤,第一反應數據庫操作cursor沒有及時關閉,editTextWatche只是add了,我以前從來不知道還需要remove啊。然后進行了查找cursor有沒有沒關閉,remove了textwatcher。再次運行依然這幾處地方報錯,日了uzi了。后來故意在一個界面不關閉游標,運行,竟然沒有報數據庫的錯誤。最終折騰了一下午,掉到這兩個地方有錯誤的圈里出不來了,也沒解決問題。不過后來再改別的地方是發現一個計時器沒有管,聯想到了這個界面有個自定義動畫,果然,這里也有個計時器沒關閉,然后關閉了。運行沒有內存溢出了。現在程序穩穩的13M左右運行。問題來了,為什么沒有直接指出計時器導致的內存泄露,而是指向這么一些沒有真正錯誤的東西,還有這個東西該怎么讀啊?