說來慚愧,工作這么多年,竟然一直忽略了這個問題,今天來講講,首先你要知道內(nèi)存泄漏,相對于安卓來說“泄漏”就是添加,系統(tǒng)分配給每個應用的內(nèi)存大小一定,如何利用好內(nèi)存尤為重要,如果我們的對象不能被垃圾回收機制及時回收就會出現(xiàn)內(nèi)存泄漏,導致最后內(nèi)存占用越來越大,出現(xiàn)OOM(內(nèi)存溢出)最后可能導致應用FC(強制關閉);
垃圾回收機制原則:一個對象不被任何引用指向 會被GC發(fā)現(xiàn)回收
Handler內(nèi)存泄漏原因:內(nèi)部類對象持有外部類對象的引用(Activity銷毀時,Handler還有Activity的引用)
Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { mImageView.setImageBitmap(mBitmap); } } 一般我們會這樣用,這個時候Hanlder作為Activity的內(nèi)部類,就會持有Activity的對象,(比如Handler需要處理很多的消息,但是這時候Activity退出了,那么垃圾回收不會回收他的對象,因為Hanlder需要處理消息,所以不會銷毀,但是他不銷毀又持有Activity的對象,所以Activity也不會銷毀,導致內(nèi)存泄漏)
通用解決方法:用外部類
首先直接實例Handler的子類,不在用匿名內(nèi)部類,因為要操作Activity中的東西,所以構(gòu)造方法中傳入Activity
PRivate final Handler mHandler = new MyHandler(this);
private static class MyHandler extends Handler { private final WeakReference<HandlerActivity2> mActivity; public MyHandler(HandlerActivity2 activity) { mActivity = new WeakReference<HandlerActivity2>(activity); } public void handleMessage(Message msg) { System.out.println(msg); if (mActivity.get() == null) { return; } mActivity.get().todo(); } 其中mActivity.get()會獲取到Activity對象,todo()是自己寫的一個方法,可以在里面寫自己的邏輯,在構(gòu)造方法中傳入Activity對象,用弱應用連接,當Activity銷毀,弱應用連接斷掉,if判斷這兒拿不到activity對象,就會直接return,那么這個Handler的子類不再持有activity的引用,所以垃圾回收就能回收activity了,但是還有點問題,既然Activity已經(jīng)退出,那么Handler發(fā)送處理消息就沒必要了,所以還要停止Handler
public void onDestroy() { // If null, all callbacks and messages will be removed. mHandler.removeCallbacksAndMessages(null);} 上一個總體代碼,宏觀把控一下:
/** * * 實現(xiàn)的主要功能。 * * @version 1.0.0 * @author Abay Zhuang <br/> * Create at 2014-7-28 */public class HandlerActivity2 extends Activity { private static final int MESSAGE_1 = 1; private static final int MESSAGE_2 = 2; private static final int MESSAGE_3 = 3; private final Handler mHandler = new MyHandler(this); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mHandler.sendMessageDelayed(Message.obtain(), 60000); // just finish this activity finish(); } public void todo() { }; private static class MyHandler extends Handler { private final WeakReference<HandlerActivity2> mActivity; public MyHandler(HandlerActivity2 activity) { mActivity = new WeakReference<HandlerActivity2>(activity); } @Override public void handleMessage(Message msg) { System.out.println(msg); if (mActivity.get() == null) { return; } mActivity.get().todo(); } } 記著寫onDestory()方法。。。。
新聞熱點
疑難解答