第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定

android-內(nèi)部類導(dǎo)致的內(nèi)存泄漏實(shí)戰(zhàn)解析

標(biāo)簽:
Android

非静态内部类: 成员内部类, 局部内部类、 匿名内部类。 会有对外部类的引用。这样内部类中耗时操作在用户频繁退出重启APP相关Activity时很容易导致内存泄漏。

一、匿名内部类:Runnable

1、泄漏版

        new Thread(new Runnable() {            @Override
            public void run() {                try {                    //模拟耗时操作
                    Thread.sleep(15000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

连续多次退出重启后发现:

5b7fd3be0001b3a805400960.jpg

2、优化版:

将 非静态内部类 改为 静态非匿名内部类

  new Thread(new MyRunnable()).start();  private static class MyRunnable implements Runnable {

        @Override
        public void run() {            try {
                Thread.sleep(15000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

二、成员内部类:Handler

1、泄漏版:

   private final static int MESSAGECODE = 1;    private Handler handler = new Handler() {        @Override
        public void handleMessage(Message msg) {            super.handleMessage(msg);
            Log.d("mmmmmmmm", "handler " + msg.what);
        }
    };    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);        new Thread(new Runnable() {            @Override
            public void run() {
                handler.sendEmptyMessage(MESSAGECODE);                try {
                    Thread.sleep(8000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handler.sendEmptyMessage(MESSAGECODE);
            }
        }).start();
    }

连续多次退出重启后发现:

5b7fd3bf0001441b05400960.jpg

2、优化版:

2.1、使用静态内部类 
2.2、使用弱引用 
2.3、在onDestroy() 里面取消异步任务。(注意:单纯的取消还是会内存泄漏)

    private final static int MESSAGECODE = 1;    private static Handler handler;//静态

    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);        //创建Handler
        handler = new MyHandler(this);        //创建线程并且启动线程
        new Thread(new MyRunnable()).start();
    }    //1、避免Handler引用activity造成的内存泄漏:使用静态内部类+ 使用弱引用
    private static class MyHandler extends Handler {
        WeakReference<HandlerActivity> weakReference;        public MyHandler(HandlerActivity activity) {
            weakReference = new WeakReference<HandlerActivity>(activity);
        }        @Override
        public void handleMessage(Message msg) {            super.handleMessage(msg);            if (weakReference.get() != null) {                // update android ui
                Log.d("mmmmmmmm", "handler " + msg.what);
            }
        }
    }    //2、避免非静态Runnable内部类引用activity造成的内存泄漏
    private static class MyRunnable implements Runnable {

        @Override
        public void run() {
            handler.sendEmptyMessage(MESSAGECODE);            try {
                Thread.sleep(8000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            handler.sendEmptyMessage(MESSAGECODE);
        }
    }    @Override
    protected void onDestroy() {        super.onDestroy();        //3、如果参数为null的话,会将所有的Callbacks和Messages全部清除掉。
        handler.removeCallbacksAndMessages(null);
    }

三、匿名内部类:TimerTask

1、泄漏版:

        new Timer().schedule(new TimerTask() {            @Override
            public void run() {                while (true) ;
            }
        }, 1000);  // 1秒后启动一个任务

连续多次退出重启后发现:

5b7fd3c00001969005400960.jpg

2、优化版:

1、在适当的时机进行Cancel。 
2、TimerTask用静态内部类

 private TimerTask timerTask ;    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        timerTask = new MyTimerTask() ;        new Timer().schedule( timerTask ,1000 );  // 1秒后启动一个任务
    }    private static class MyTimerTask extends TimerTask {

        @Override
        public void run() {            while(true){
                Log.d( "ttttttttt" , "timerTask" ) ;
            }
        }
    }    @Override
    protected void onDestroy() {        super.onDestroy();        //取消定时任务
        if ( timerTask != null ){
            timerTask.cancel() ;
        }

    }

四、匿名内部类:AsyncTask

1、泄露版:

new AsyncTask<String,Integer,String>(){

            @Override            protected String doInBackground(String... params) {
                try {                    Thread.sleep( 6000 );
                } catch (InterruptedException e) {

                }                return "ssss";
            }


            @Override            protected void onPostExecute(String s) {
                super.onPostExecute(s);                Log.d( "mmmmmm activity2 " , "" + s ) ;
            }

}.execute();

连续多次退出重启后发现:

5b7fd3c10001e8ca05400960.jpg

2、优化版

1、自定义静态AsyncTask类 
2、AsyncTask的周期和Activity周期应该保持一致。也就是在Activity生命周期结束时要将AsyncTask cancel掉。

    private static MyTask myTask;    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myTask = new MyTask();
        myTask.execute();
    }    //1、创建静态内部类
    private static class MyTask extends AsyncTask {

        @Override
        protected Object doInBackground(Object[] params) {            try {                //模拟耗时操作
                Thread.sleep(15000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }            return "";
        }
    }    @Override
    protected void onDestroy() {        super.onDestroy();        //2、取消异步任务
        if (myTask != null) {
            myTask.cancel(true);
        }
    }

原文链接:http://www.apkbus.com/blog-822415-77067.html

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報(bào)

0/150
提交
取消