国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

安卓Handler內(nèi)存泄漏

2019-11-09 15:25:21
字體:
供稿:網(wǎng)友

     說來慚愧,工作這么多年,竟然一直忽略了這個(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()方法。。。。     


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 洪雅县| 平阴县| 民乐县| 广灵县| 佳木斯市| 潜山县| 崇礼县| 洛浦县| 中山市| 镇康县| 靖远县| 当阳市| 个旧市| 会东县| 泸西县| 咸阳市| 墨竹工卡县| 延吉市| 溧阳市| 乌拉特前旗| 岳池县| 微博| 潮安县| 哈尔滨市| 嘉义市| 连江县| 江华| 安福县| 防城港市| 诸暨市| 湖南省| 静乐县| 龙门县| 仙桃市| 大竹县| 观塘区| 乳山市| 环江| 高阳县| 隆安县| 金川县|