AndroidStudio中Handler類的記憶體溢出風險

來源:互聯網
上載者:User

標籤:create   trace   layout   reference   rac   port   eva   sage   send   

package com.test.king.xmlparser;import android.annotation.SuppressLint;import android.app.Activity;import android.content.res.Resources;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.TextView;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import java.io.IOException;import java.lang.ref.WeakReference;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    private static TextView tvContent;    private static final int MSG_FINISH=0x0001;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tvContent=findViewById(R.id.tv_content);    }    //內部類解決可能存在的記憶體溢出    /*    *、本文描述靜態和非靜態內部類的區別是非靜態內部類持有外部類的引用。2、內部類執行個體的持有對象的生命週期大於其外部類對象,那麼就有可能導致記憶體泄露。比如,要執行個體化一個超出activity生命週期的內部類對象,避免使用非靜態內部類。建議使用靜態內部類並且在內部類中持有外部類的弱引用。    *    * */    //靜態內部類    private static class MyHandler extends Handler {        private final WeakReference<MainActivity> mActivity;        //構造方法        public MyHandler(MainActivity activity) {            mActivity = new WeakReference<MainActivity>(activity);//對外部類的弱引用        }        @Override        public void handleMessage(Message msg) {            MainActivity activity = mActivity.get();            if (activity != null) {                switch (msg.what)                {                    case MSG_FINISH:                        List<String> contents=(List<String>)msg.obj;                        //在主線程中顯示                        for(String content:contents)                        {                            tvContent.append(content+"\n");                        }                        break;                }            }        }    }    //new Handler對象處理訊息,下文有引用    private final MyHandler mHandler = new MyHandler(this);    //警告    /*    private Handler handler=new Handler()    {        @Override        //重寫handleMessage方法處理訊息        public void handleMessage(Message msg) {            switch (msg.what)            {                case MSG_FINISH:                    List<String> contents=(List<String>)msg.obj;                    //在主線程中顯示                    for(String content:contents)                    {                        tvContent.append(content+"\n");                    }                    break;            }        }    };*/    public  void parser(View view) throws IOException, XmlPullParserException {     //常規方法     /*     List<String> contents=getPullParserContent(getResources(),R.xml.words);     for(String content:contents)     {         tvContent.append(content+"\n");     }*/     //解析XML可能需要耗費很長的時間,所以這裡單獨做一個子線程        new Thread()        {            @Override            //重寫run方法            public void run()            {                try {                    List<String> contents=getPullParserContent(getResources(),R.xml.words);                    //完成工作,通知主線程                    Message msg=mHandler.obtainMessage();//也可以new Message                    msg.what=MSG_FINISH;                    msg.obj=contents;                    mHandler.sendMessage(msg);                } catch (IOException e) {                    e.printStackTrace();                } catch (XmlPullParserException e) {                    e.printStackTrace();                }            }        }.start();    }    private List<String> getPullParserContent(Resources res,int id) throws IOException, XmlPullParserException {        List<String> contents = null;        String tagName;        //XmlPullParser        XmlPullParser parser = res.getXml(id);        //Pull解析本質是SAX解析        int eventType = parser.getEventType();        while (eventType != XmlPullParser.END_DOCUMENT) {            switch (eventType) {                case XmlPullParser.START_DOCUMENT:                    Log.i("Test", "START_DOCUMENT");                    contents=new ArrayList<String>();                    break;                case XmlPullParser.END_DOCUMENT:                    break;                case XmlPullParser.START_TAG:                    tagName = parser.getName();                    if (tagName.equals("word")) {                        String value = parser.getAttributeValue(0);                        contents.add(value);                        Log.i("Test", "START_TAG:" + tagName + " " + value);                    }                    break;                case XmlPullParser.END_TAG:                    tagName = parser.getName();                    Log.i("Test", "END_TAG:" + tagName);                    break;            }            eventType = parser.next();        }        return contents;    }}

  

AndroidStudio中Handler類的記憶體溢出風險

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.