說來慚愧,工作這么多年,竟然一直忽略了這個(gè)問題,今天來講講,首先你要知道內(nèi)存泄漏,相對(duì)于安卓來說“泄漏”就是添加,系統(tǒng)分配給每個(gè)應(yīng)用的內(nèi)存大小一定,如何利用好內(nèi)存尤為重要,如果我們的對(duì)象不能被垃圾回收機(jī)制及時(shí)回收就會(huì)出現(xiàn)內(nèi)存泄漏,導(dǎo)致最后內(nèi)存占用越來越大,出現(xiàn)OOM(內(nèi)存溢出)最后可能導(dǎo)致應(yīng)用FC(強(qiáng)制關(guān)閉);
垃圾回收機(jī)制原則:一個(gè)對(duì)象不被任何引用指向 會(huì)被GC發(fā)現(xiàn)回收
Handler內(nèi)存泄漏原因:內(nèi)部類對(duì)象持有外部類對(duì)象的引用(Activity銷毀時(shí),Handler還有Activity的引用)
Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { mImageView.setImageBitmap(mBitmap); } } 一般我們會(huì)這樣用,這個(gè)時(shí)候Hanlder作為Activity的內(nèi)部類,就會(huì)持有Activity的對(duì)象,(比如Handler需要處理很多的消息,但是這時(shí)候Activity退出了,那么垃圾回收不會(huì)回收他的對(duì)象,因?yàn)镠anlder需要處理消息,所以不會(huì)銷毀,但是他不銷毀又持有Activity的對(duì)象,所以Activity也不會(huì)銷毀,導(dǎo)致內(nèi)存泄漏)
通用解決方法:用外部類
首先直接實(shí)例Handler的子類,不在用匿名內(nèi)部類,因?yàn)橐僮鰽ctivity中的東西,所以構(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()會(huì)獲取到Activity對(duì)象,todo()是自己寫的一個(gè)方法,可以在里面寫自己的邏輯,在構(gòu)造方法中傳入Activity對(duì)象,用弱應(yīng)用連接,當(dāng)Activity銷毀,弱應(yīng)用連接斷掉,if判斷這兒拿不到activity對(duì)象,就會(huì)直接return,那么這個(gè)Handler的子類不再持有activity的引用,所以垃圾回收就能回收activity了,但是還有點(diǎn)問題,既然Activity已經(jīng)退出,那么Handler發(fā)送處理消息就沒必要了,所以還要停止Handler
public void onDestroy() { // If null, all callbacks and messages will be removed. mHandler.removeCallbacksAndMessages(null);} 上一個(gè)總體代碼,宏觀把控一下:
/** * * 實(shí)現(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()方法。。。。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注