Handler 匿名內(nèi)部類昨悼、非靜態(tài)內(nèi)部類
如何避免
1:使用靜態(tài)內(nèi)部類率触,加上static 修飾
2:使用WeakReference
private static class MyHandler extends Handler {
WeakReference<HandlerActivity> weakReference;
public MyHandler(HandlerActivity activity) {
weakReference = new WeakReference<HandlerActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (weakReference.get() != null) {
...
}
}
}
3:根據(jù)業(yè)務(wù)情況在 onDestroy 中移除回調(diào)、取消異步任務(wù)
protected void onDestroy() {
super.onDestroy();
myHandler.removeCallbacksAndMessages(null);
myAsyncTask.cancel(true ) ;
}
靜態(tài)變量
靜態(tài)變量的生命周期是在類加載時(shí)開始穴张,類卸載時(shí)結(jié)束。進(jìn)程沒有被殺死玻驻,靜態(tài)變量就會(huì)一直存在。 如果靜態(tài)變量強(qiáng)應(yīng)用了 Activity 中的變量击狮,那當(dāng)這個(gè) Activity 銷毀也不會(huì)被釋放益老。
如何避免
1.尋找和靜態(tài)變量生命期差不多的替代
如 單例中的 context
使用 ApplictionContext
代替
2.強(qiáng)引用改成弱引用
如 WeakHashMap WeakReference
監(jiān)聽器有 add 沒有 remove
如何避免
1.onDestroy 時(shí)調(diào)用 remove
2.使用 WeakReference (不推薦, 優(yōu)先調(diào)用 remove 來解決,誰創(chuàng)建誰回收)
3.考慮使用 EventBus 档冬??
資源未關(guān)閉
使用了BraodcastReceiver酷誓, Cursor态坦, Bitmap,ContentObserver伞梯,Callback 等資源,當(dāng)不再需要時(shí)漾峡,需要釋放掉
代碼方面的問題
1.Bitmap 沒有 recycle
2.Adapter 沒有使用 converView
3.注冊(cè)事件沒有 remove
4.其他(待補(bǔ)充。生逸。。)