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

首頁 > 學院 > 開發(fā)設計 > 正文

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

2019-11-09 16:39:56
字體:
供稿:網(wǎng)友

     說來慚愧,工作這么多年,竟然一直忽略了這個問題,今天來講講,首先你要知道內(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()方法。。。。     


上一篇:xcoode自動打包報錯

下一篇:xib的加載

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 讷河市| 信丰县| 乌兰县| 宽甸| 崇明县| 昌都县| 库尔勒市| 辽阳市| 蓝田县| 武义县| 尖扎县| 巨鹿县| 通江县| 丽江市| 普洱| 新巴尔虎右旗| 吉木萨尔县| 和田市| 水富县| 普兰店市| 禹州市| 莎车县| 南陵县| 包头市| 自治县| 南岸区| 刚察县| 镇原县| 汾阳市| 临湘市| 遂溪县| 宝鸡市| 贞丰县| 城步| 金阳县| 昆明市| 天等县| 高邮市| 习水县| 岢岚县| 远安县|