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