Android的ListView控件窗口泄漏错误 [英] Android ListView window leak error

查看:129
本文介绍了Android的ListView控件窗口泄漏错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一点我的手的问题,我将需要一点点。我的应用程序总是崩溃,当我看堆栈跟踪这是我回来...

  theproblemsolver.ListView渗漏窗口com.android.internal.policy.impl.PhoneWindow $ {DecorView VE 40d0e800 ....  -  [R ..... ID 0,0-234 72},最初这里加入
11月7日至27日:05:56.119:E /窗口管理器(913):android.view.WindowLeaked:活动com.theproblemsolver.ListView渗漏窗口com.android.internal.policy.impl.PhoneWindow $ {DecorView VE 40d0e800 ... :R ..... ID 0,0-234,72},最初这里加入
11月7日至27日:05:56.119:E /窗口管理器(913):在android.view.ViewRootImpl<&初始化GT;(ViewRootImpl.java:354)
11月7日至27日:05:56.119:E /窗口管理器(913):在android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:216)
11月7日至27日:05:56.119:E /窗口管理器(913):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
11月7日至27日:05:56.119:E /窗口管理器(913):在android.app.Dialog.show(Dialog.java:281)
11月7日至27日:05:56.119:E /窗口管理器(913):在com.theproblemsolver.ListView $ LoadAllData.on preExecute(ListView.java:85)
11月7日至27日:05:56.119:E /窗口管理器(913):在android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
11月7日至27日:05:56.119:E /窗口管理器(913):在android.os.AsyncTask.execute(AsyncTask.java:534)
11月7日至27日:05:56.119:E /窗口管理器(913):在com.theproblemsolver.ListView.onCreate(ListView.java:52)
11月7日至27日:05:56.119:E /窗口管理器(913):在android.app.Activity.performCreate(Activity.java:5104)
11月7日至27日:05:56.119:E /窗口管理器(913):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
27 11:05:56.119:E /窗口管理器(913):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
11月7日至27日:05:56.119:E /窗口管理器(913):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
11月7日至27日:05:56.119:E /窗口管理器(913):在android.app.ActivityThread.access $ 600(ActivityThread.java:141)
11月7日至27日:05:56.119:E /窗口管理器(913):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1234)
11月7日至27日:05:56.119:E /窗口管理器(913):在android.os.Handler.dispatchMessage(Handler.java:99)
11月7日至27日:05:56.119:E /窗口管理器(913):在android.os.Looper.loop(Looper.java:137)
11月7日至27日:05:56.119:E /窗口管理器(913):在android.app.ActivityThread.main(ActivityThread.java:5041)
11月7日至27日:05:56.119:E /窗口管理器(913):在java.lang.reflect.Method.invokeNative(本机方法)
11月7日至27日:05:56.119:E /窗口管理器(913):在java.lang.reflect.Method.invoke(Method.java:511)
11月7日至27日:05:56.119:E /窗口管理器(913):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)
11月7日至27日:05:56.119:E /窗口管理器(913):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11月7日至27日:05:56.119:E /窗口管理器(913):在dalvik.system.NativeStart.main(本机方法)

谁能告诉我这是什么,我能做些什么来解决这个问题。

MainActivity

 公共类MainActivity延伸活动{    的EditText等;
    按钮的getAnswer;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);        按钮的getAnswer =(按钮)findViewById(R.id.button1);
        getanswer.setOnClickListener(新OnClickListener(){        @覆盖
        公共无效的onClick(视图v){
            意图I =新意图(MainActivity.this,ListView.class);
            startActivity(ⅰ);
        }
        });
    }
}

的ListView活动

 公共类ListView的扩展ListActivity {    私人ProgressDialog pDialog;    JSONParsser jParser =新JSONParsser();
    ArrayList的<&HashMap的LT;字符串,字符串>> questionList;    私人静态字符串URI =htt​​p://example.com/json;;    // JSONObject的JSON = jParser.getJSONFromURI(URI);     最后弦乐TAG_RESULTS =ResultsSet;
     最后弦乐TAG_SUBJECT =主题;
     最后弦乐TAG_NUMANSWERS =NumAnswers​​;
     最后弦乐TAG_QUESTION =问题;
     最后弦乐TAG_QUESTION_CONTENT =内容;
     最后弦乐TAG_QUESTION_CHOSENANSWER =ChosenAnswer;
     最后弦乐TAG_QUESTION_ANSWERS =答案;            JSONArray ResultsSet = NULL;
    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.listview);    questionList =新的ArrayList<&HashMap的LT;字符串,字符串>>();    android.widget.ListView LV = getListView();    新LoadAllData()执行();    lv.setOnItemClickListener(新OnItemClickListener(){    @覆盖
        公共无效onItemClick(适配器视图<>母公司,观景,INT位置,长的id){
        }
    });}    @覆盖
    保护无效的onActivityResult(INT申请code,INT结果code,意图数据){
        super.onActivityResult(要求code,结果code,数据);        如果(结果code == 100){
            意向意图= getIntent();
            完();
            startActivity(意向);
        }
    }    类LoadAllData扩展的AsyncTask<字符串,字符串,字符串> {        @覆盖
        在preExecute保护无效(){
            super.on preExecute();
            pDialog =新ProgressDialog(ListView.this);
            pDialog.setMessage(加载数据请稍候...);
            pDialog.setIndeterminate(假);
            pDialog.setCancelable(假);
            pDialog.show();
        }        保护字符串doInBackground(字符串参数... args){            尝试{
                    JSONObject的JSON = jParser.getJSONFromURI(URI);
                    ResultsSet = json.getJSONArray(TAG_RESULTS);                   的for(int i = 0; I< ResultsSet.length();我++){
                       的JSONObject R = ResultsSet.getJSONObject(ⅰ);
                       字符串主题= r.getString(TAG_SUBJECT);
                       字符串NumAnswers = r.getString(TAG_NUMANSWERS);                       JSONObject的问题= r.getJSONObject(TAG_QUESTION);
                       字符串内容= Question.getString(TAG_QUESTION_CONTENT);
                       字符串ChosenAnswer = Question.getString(TAG_QUESTION_CHOSENANSWER);
                       字符串答案= Question.getString(TAG_QUESTION_ANSWERS);                       HashMap的<字符串,字符串>地图=新的HashMap<字符串,字符串>();                       map.put(TAG_SUBJECT,主题);
                       map.put(TAG_NUMANSWERS,NumAnswers);
                   }            }赶上(JSONException E){
                e.printStackTrace();
            }
            返回null;
        }
        保护无效onPostExecute(字符串file_URI){            pDialog.dismiss();
            runOnUiThread(新的Runnable(){
            公共无效的run(){
                ListAdapter适配器=新SimpleAdapter(getBaseContext(),questionList,
                        R.layout.row,
                        新的String [] {TAG_SUBJECT,TAG_NUMANSWERS},新的INT [] {
                        R.id.Subject,R.id.NumAnswers});                setListAdapter(适配器);                }
            });        }
}}

SimpleListItem

 公共类SingleListItem延伸活动{    TextView的主题;    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.singlelistitem);    主题=(的TextView)findViewById(R.id.Subject2);    意向I = getIntent();
    字符串主题= i.getStringExtra(TAG_SUBJECT);
    subject.setText(一级学科);    }
}

我把两个活动是在我的项目,我没有张贴的原因是因为我不知道他们是否重要与否

JSONParsser活动

 公共类JSONParsser {    静态InputStream为= NULL;
    静态的JSONObject jObj = NULL;
    静态JSON字符串=;
    的EditText等;    公共JSONParsser(){
    }    公众的JSONObject getJSONFromURI(字符串URI){        尝试{
        HttpClient的客户端=新DefaultHttpClient();
        尝试{
            URI网站=新的URI(http://example.com/json);
            HTTPGET请求=新HTTPGET();
            request.setURI(网站);
            尝试{
                HTT presponse响应= client.execute(请求);
            HttpEntity httpEntity = response.getEntity();
            是= httpEntity.getContent();            }赶上(ClientProtocolException E){
                // TODO自动生成catch块
                e.printStackTrace();
            }赶上(IOException异常五){
                // TODO自动生成catch块
                e.printStackTrace();
            }
        }赶上(的URISyntaxException E){
                // TODO自动生成catch块
                e.printStackTrace();
            }
        返回jObj;        }最后{}    } {    }}

InstanceOfJSONParsser活动

 公共类JSONParserInstance {    JSONParsser jParser =新JSONParsser();    公共字符串URI;    JSONObject的JSON = jParser.getJSONFromURI(URI);
     私有静态最后弦乐TAG_RESULTS =ResultsSet;
     私有静态最后弦乐TAG_SUBJECT =主题;
     私有静态最后弦乐TAG_NUMANSWERS =NumAnswers​​;
     私有静态最后弦乐TAG_QUESTION =问题;
     私有静态最后弦乐TAG_QUESTION_CONTENT =内容;
     私有静态最后弦乐TAG_QUESTION_CHOSENANSWER =ChosenAnswer;
     私有静态最后弦乐TAG_QUESTION_ANSWERS =答案;            JSONArray ResultsSet = NULL; {    尝试{
       ResultsSet = json.getJSONArray(TAG_RESULTS);       的for(int i = 0; I< ResultsSet.length();我++){
           的JSONObject R = ResultsSet.getJSONObject(ⅰ);           字符串主题= r.getString(TAG_SUBJECT);
           字符串NmAnswers = r.getString(TAG_NUMANSWERS);           JSONObject的问题= r.getJSONObject(TAG_QUESTION);
           字符串内容= Question.getString(TAG_QUESTION_CONTENT);
           字符串ChosenAnswer = Question.getString(TAG_QUESTION_CHOSENANSWER);
           字符串答案= Question.getString(TAG_QUESTION_ANSWERS);       }
    }赶上(JSONException E){
       e.printStackTrace();}}}


解决方案

看来你的AsyncTask具有很强的参考你的活动。请考虑使用静态类与WeakReference的替代。

 私有静态类StaticAsyncTask扩展的AsyncTask<字符串,字符串,字符串>(){
    私人的WeakReference<活性GT; mActivityRef;    私人StaticAsyncTask(活动callingActivity){
        mActivityRef =新的WeakReference<活性GT;(callingActivity);
    }    @覆盖
    保护字符串doInBackground(字符串参数... args){
        // TODO:做的东西
    }    @覆盖
    保护无效onProgressUpdate(字符串...进度){
        // TODO:做的东西
    }    @覆盖
    保护无效onPostExecute(字符串结果){
        活动活动= mActivityRef.get();
        如果(活动!= NULL){
            // TODO:做的东西与我的非空活动
        }
    }
}

I am having a bit of a problem on my hands and I'm going to need a little. My app keeps crashing and when I look at the stacktrace this is what I get back...

theproblemsolver.ListView has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{40d0e800 V.E..... R.....ID 0,0-234,72} that was originally added here
07-27 11:05:56.119: E/WindowManager(913): android.view.WindowLeaked: Activity com.theproblemsolver.ListView has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{40d0e800 V.E..... R.....ID 0,0-234,72} that was originally added here
07-27 11:05:56.119: E/WindowManager(913):   at android.view.ViewRootImpl.<init>(ViewRootImpl.java:354)
07-27 11:05:56.119: E/WindowManager(913):   at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:216)
07-27 11:05:56.119: E/WindowManager(913):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
07-27 11:05:56.119: E/WindowManager(913):   at android.app.Dialog.show(Dialog.java:281)
07-27 11:05:56.119: E/WindowManager(913):   at com.theproblemsolver.ListView$LoadAllData.onPreExecute(ListView.java:85)
07-27 11:05:56.119: E/WindowManager(913):   at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
07-27 11:05:56.119: E/WindowManager(913):   at android.os.AsyncTask.execute(AsyncTask.java:534)
07-27 11:05:56.119: E/WindowManager(913):   at com.theproblemsolver.ListView.onCreate(ListView.java:52)
07-27 11:05:56.119: E/WindowManager(913):   at android.app.Activity.performCreate(Activity.java:5104)
07-27 11:05:56.119: E/WindowManager(913):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
27 11:05:56.119: E/WindowManager(913):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
07-27 11:05:56.119: E/WindowManager(913):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-27 11:05:56.119: E/WindowManager(913):   at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-27 11:05:56.119: E/WindowManager(913):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-27 11:05:56.119: E/WindowManager(913):   at android.os.Handler.dispatchMessage(Handler.java:99)
07-27 11:05:56.119: E/WindowManager(913):   at android.os.Looper.loop(Looper.java:137)
07-27 11:05:56.119: E/WindowManager(913):   at android.app.ActivityThread.main(ActivityThread.java:5041)
07-27 11:05:56.119: E/WindowManager(913):   at java.lang.reflect.Method.invokeNative(Native Method)
07-27 11:05:56.119: E/WindowManager(913):   at java.lang.reflect.Method.invoke(Method.java:511)
07-27 11:05:56.119: E/WindowManager(913):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-27 11:05:56.119: E/WindowManager(913):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-27 11:05:56.119: E/WindowManager(913):   at dalvik.system.NativeStart.main(Native Method)

Can somebody please tell me what this is and what I can do to fix this..

MainActivity

public class MainActivity extends Activity {

    EditText et;
    Button getanswer;

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

        Button getanswer = (Button) findViewById(R.id.button1);
        getanswer.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent i = new Intent(MainActivity.this, ListView.class);
            startActivity(i);
        }


        });
    } 
}

ListView Activity

public class ListView extends ListActivity {

    private ProgressDialog pDialog;

    JSONParsser jParser = new JSONParsser();
    ArrayList<HashMap<String, String>> questionList;

    private static String URI = "http://example.com/json";;

    //JSONObject json = jParser.getJSONFromURI(URI); 

     final String TAG_RESULTS = "ResultsSet";
     final String TAG_SUBJECT = "Subject";
     final String TAG_NUMANSWERS = "NumAnswers";
     final String TAG_QUESTION = "Question";
     final String TAG_QUESTION_CONTENT = "Content";
     final String TAG_QUESTION_CHOSENANSWER = "ChosenAnswer";
     final String TAG_QUESTION_ANSWERS = "Answers";

            JSONArray ResultsSet = null;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        //setContentView(R.layout.listview);

    questionList = new ArrayList<HashMap<String, String>>();

    android.widget.ListView lv = getListView(); 

    new LoadAllData().execute();

    lv.setOnItemClickListener(new OnItemClickListener() {

    @Override
        public void onItemClick(AdapterView<?> parent, View view,int position, long id) {


        }
    });

}

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == 100) {
            Intent intent = getIntent();
            finish();
            startActivity(intent);
        }
    }

    class LoadAllData extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(ListView.this);
            pDialog.setMessage("Loading Data. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        protected String doInBackground(String... args) {

            try {
                    JSONObject json = jParser.getJSONFromURI(URI);
                    ResultsSet = json.getJSONArray(TAG_RESULTS);

                   for(int i = 0; i < ResultsSet.length(); i++) {
                       JSONObject r = ResultsSet.getJSONObject(i);
                       String Subject = r.getString(TAG_SUBJECT);
                       String NumAnswers = r.getString(TAG_NUMANSWERS);

                       JSONObject Question = r.getJSONObject(TAG_QUESTION);
                       String Content = Question.getString(TAG_QUESTION_CONTENT);
                       String ChosenAnswer = Question.getString(TAG_QUESTION_CHOSENANSWER);
                       String Answers = Question.getString(TAG_QUESTION_ANSWERS);

                       HashMap<String, String> map = new HashMap<String, String>();

                       map.put(TAG_SUBJECT, Subject);
                       map.put(TAG_NUMANSWERS, NumAnswers);
                   }



            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;


        }


        protected void onPostExecute(String file_URI) {

            pDialog.dismiss();
            runOnUiThread(new Runnable() {
            public void run() {
                ListAdapter adapter = new SimpleAdapter(getBaseContext(), questionList,
                        R.layout.row,
                        new String[] { TAG_SUBJECT, TAG_NUMANSWERS }, new int[] {
                        R.id.Subject, R.id.NumAnswers });

                setListAdapter(adapter);



                }
            });

        }
}}

SimpleListItem

 public class SingleListItem extends Activity {

    TextView subject;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.singlelistitem);

    subject = (TextView) findViewById(R.id.Subject2);

    Intent i = getIntent();
    String Subject = i.getStringExtra("TAG_SUBJECT");
    subject.setText(Subject);

    }
}

I'm putting in two Activities that's in my project and the reason I didn't post them is because I didn't know if they are important or not

JSONParsser Activity

public class JSONParsser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
    EditText et;

    public JSONParsser () {
    }

    public JSONObject getJSONFromURI(String URI) {

        try{
        HttpClient client = new DefaultHttpClient();
        try {
            URI website = new URI("http://example.com/json");
            HttpGet request = new HttpGet();
            request.setURI(website);
            try {
                HttpResponse response = client.execute(request);
            HttpEntity httpEntity = response.getEntity();
            is = httpEntity.getContent();

            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (URISyntaxException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        return jObj;

        }finally{}

    }{

    }}

InstanceOfJSONParsser Activity

public class JSONParserInstance {

    JSONParsser jParser = new JSONParsser();

    public String URI;

    JSONObject json = jParser.getJSONFromURI(URI);


     private static final String TAG_RESULTS = "ResultsSet";
     private static final String TAG_SUBJECT = "Subject";
     private static final String TAG_NUMANSWERS = "NumAnswers";
     private static final String TAG_QUESTION = "Question";
     private static final String TAG_QUESTION_CONTENT = "Content";
     private static final String TAG_QUESTION_CHOSENANSWER = "ChosenAnswer";
     private static final String TAG_QUESTION_ANSWERS = "Answers";

            JSONArray ResultsSet = null; {

    try {
       ResultsSet = json.getJSONArray(TAG_RESULTS);

       for(int i = 0; i < ResultsSet.length(); i++){
           JSONObject r = ResultsSet.getJSONObject(i);

           String Subject = r.getString(TAG_SUBJECT);
           String NmAnswers = r.getString(TAG_NUMANSWERS);

           JSONObject Question = r.getJSONObject(TAG_QUESTION);
           String Content = Question.getString(TAG_QUESTION_CONTENT);
           String ChosenAnswer = Question.getString(TAG_QUESTION_CHOSENANSWER);
           String Answers = Question.getString(TAG_QUESTION_ANSWERS);

       }
    } catch (JSONException e) {
       e.printStackTrace();

}}}

解决方案

It appears that your AsyncTask has a strong reference to your Activity. Please consider using a static class with a WeakReference instead.

private static class StaticAsyncTask extends AsyncTask<String, String, String>() {
    private WeakReference<Activity> mActivityRef;

    private StaticAsyncTask(Activity callingActivity) {
        mActivityRef = new WeakReference<Activity>(callingActivity);
    }

    @Override
    protected String doInBackground(String... args) {
        // TODO: Do stuff
    }

    @Override
    protected void onProgressUpdate(String... progress) {
        // TODO: Do stuff
    }

    @Override
    protected void onPostExecute(String results) {
        Activity activity = mActivityRef.get();
        if (activity != null) {
            // TODO: Do stuff with my non-null activity
        }
    }
}

这篇关于Android的ListView控件窗口泄漏错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆