天天看點

Android 使用LeakCanary 檢測記憶體洩露

轉自:http://blog.csdn.net/sbsujjbcy/article/details/47999163

leakcanary 是 android 和 java 記憶體洩露檢測架構,該架構是square公司的一個開源庫,項目位址 leakcanary。

android 開發中你是否頻頻遇到記憶體洩露而無奈無從解決。說不定哪天你不小心寫的一行代碼就導緻了記憶體洩露。可以先看看這些問題導緻的記憶體洩露 android開發編碼規範導緻的記憶體洩露問題,而leakcanary

則很直白得檢測出了記憶體洩露并展示給我們。在使用它之前,我們來寫一個例子。

本地廣播,在開發中還是有一定的應用的,現在有這麼一個需求,要求使用本地廣播來實作,就是通過發送一個退出程式的本地廣播,所有activity接收到後就退出,這顯然是需要一個基礎的activity,其他activity繼承它。為了友善,這裡我們隻使用一個activity。

乍一看,是不是感覺寫的很對啊,那你就不夠細心了,這還是少量的代碼,對于項目中日積月累的代碼,記憶體洩露或許無處不在。我們使用leakcanary 對我們的代碼進行檢測下,看看到底哪裡發生了記憶體洩露,以及該如何解決。

使用方法也很簡單,首先加入依賴

從依賴中也是可以看出存在某種問題或陰謀的。

然後在我們程式的applictaion中進行安裝,當然,不要忘記在清單檔案中注冊該application。

我說就這麼簡單你會信,好了,我們安裝到手機上看看。安裝完成後運作該軟體,打開後退出該軟體,這時候你發現桌面上多了一個leaks的圖示。

Android 使用LeakCanary 檢測記憶體洩露

打開它後通知欄會有一個通知,通知你發生了記憶體洩露

Android 使用LeakCanary 檢測記憶體洩露

然後在軟體裡你會看到記憶體洩露的跟蹤資訊。

Android 使用LeakCanary 檢測記憶體洩露

點選下方的delete可以删除此條資訊。

仔細一看,原來是我們的mlocalbroadcatmanager發生了洩露,注冊本地廣播的時候,傳入了this,系統内部保持了這個引用,當我們退出activity時,這個引用還是指向我們的activity,導緻activity回收失敗。那麼怎麼解決了,既然退出的時候還持有引用,那麼我們取消注冊這個廣播這個引用不就沒了嗎,重寫ondestroy方法,進行取消注冊。

重新運作一下,咦,你發現記憶體不再洩露了。該軟體裡不再提示記憶體洩露的跟蹤資訊了。

Android 使用LeakCanary 檢測記憶體洩露

就是這麼簡單,如果想更進一步了解使用方法,比如檢測fragment有沒有洩露。可以參考官方給的例子,并且記憶體洩露的跟蹤資訊也是可以上傳到伺服器的,更多内容,參考 leakcanary

源碼下載下傳

http://download.csdn.net/detail/sbsujjbcy/9048449

繼續閱讀