handler耗時引發(fā)的內存泄漏
當activity當中存在handler接收耗時的消息時糕档,比如我們一般在網(wǎng)絡請求切換線程時,經(jīng)常使用到handler拌喉,假設消息還沒有發(fā)送完成速那,但是頁面已經(jīng)被關閉,也就說activity已經(jīng)執(zhí)行了ondestroy方法尿背。當gc回收時端仰,會出現(xiàn)改activity不能被回收的情況,導致內存泄漏田藐。
解決辦法:當activity銷毀的時候荔烧,調用handler的removeCallbacksAndMessages方法,移除消息任務汽久,然后將handler對象及線程置空鹤竭。
內部類引發(fā)的內存泄漏(當然handler或子線程一般也作為內部類使用)
因為java當中,內部類默認持有外部類的引用景醇,當外部類銷毀后臀稚,一旦gc回收該實例,發(fā)現(xiàn)內部類持有他的引用而導致不能回收該實例三痰,出現(xiàn)內存泄漏的情況吧寺。
解決方法:將內部類改為靜態(tài)內部類窜管,因為靜態(tài)內部類生命周期和應用一樣長,所以當退出程序的時候會一同回收該實例稚机,并不會影響外部類的回收微峰。
單例導致的內存泄漏
因為在使用單例的時候,經(jīng)常會傳入一個本類的上下文對象抒钱,而單例是靜態(tài)的蜓肆,生命周期和application一樣長,當activity銷毀的時候谋币,該單例持有activity的引用導致其不能被回收仗扬,出現(xiàn)內存泄漏。
解決方法:在使用上下文的時候蕾额,傳全局上下文早芭。
資源未關閉
Cursor,stream诅蝶,database退个,Butterknife,broadcastreciver调炬,bindservice语盈,eventBus
比如這些東西在使用完成后,需要進行close或者Unbind處理缰泡,以節(jié)省內存
Bitmap對象不在使用時調用recycle()釋放內存
Timer計時器刀荒、動畫,因為這些涉及耗時問題棘钞,如果activity銷毀缠借,而該任務并未執(zhí)行完成,會導致內存泄漏宜猜,所以一般在activity中如果使用到這些耗時任務泼返,需要在activity銷毀時,做對應處理姨拥,比如調用timer的cancel方法绅喉,或者動畫的cancel方法并將對象置空
一些監(jiān)聽器的內存泄漏,比如說我們給edittext設置輸入文字監(jiān)聽時垫毙,當監(jiān)聽到文字發(fā)生變化霹疫,我們通過獲取變化后的文字執(zhí)行了耗時任務(比如獲取到edittext里的內容上傳服務器),當耗時任務未執(zhí)行完成activity銷毀了综芥,會引發(fā)內存泄漏,所以在onDestory時猎拨,取消注冊膀藐,比如說editText調用removeTextChangedListener方法
Rxjava的內存泄漏:因為rxjava采用的是觀察者模式屠阻,當請求到數(shù)據(jù)后會根據(jù)訂閱關系將數(shù)據(jù)發(fā)送個訂閱者,而如果這時訂閱者已經(jīng)銷毀额各,就會出現(xiàn)引用該對象導致其不能被回收的情況国觉,出現(xiàn)內存泄漏,rxjava2發(fā)布的時候也發(fā)現(xiàn)了這個問題虾啦,所以在回調當中麻诀,新增加了onSubcribe回調,同時返回了一個disposable對象傲醉,可以通過判斷disposable里的isDisposed來確定當前的訂閱關系蝇闭,如果訂閱關系中的訂閱者已經(jīng)不存在且當前訂閱關系存在,解除訂閱關系硬毕,并終止數(shù)據(jù)的發(fā)送呻引。
webView引發(fā)的內存泄漏:因為webview在使用的時候一般持有activity的引用,我們一般在activity的onDestroy方法中調用mWebView.destroy();來釋放webview吐咳。如果在onDetachedFromWindow之前調用了destroy那就肯定會無法正常反注冊了逻悠,也就會導致內存泄漏。所以在銷毀webview前一定要先在onDetachedFromWindow中將webview從它的父view中移除韭脊,再調用destroy方法中調用webview的destroy童谒,我開發(fā)的時候在5.1以上的手機上發(fā)現(xiàn)這種問題比較多,因為現(xiàn)在5.1以下適配的比較少了沪羔,基本沒咋注意惠啄。
線程導致的內存泄漏:一般使用子線程都會創(chuàng)建一個內部類對象,而創(chuàng)建線程一般執(zhí)行耗時任務任内,所以這個內部類默認持有外部類的引用撵渡,如果耗時任務在activity銷毀的時候未執(zhí)行完成,會因為持有外部類引用導致外部類不能被回收死嗦。