安卓错误 : Window Leaked in AsyncTask

标签 android android-asynctask memory-leaks

我有时会遇到一个错误,提示 Activity com.prueba.omnibus.EspacialTecnico has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41e794a0 that is originally added here 当 Activity 完成并执行 asynctask 函数时,就会发生这种情况。我进行了搜索,但我不知道问题出在哪里。

当用户点击“完成”并发生错误时执行的操作。

protected Dialog onCreateDialog(int id) {
    super.onCreateDialog(id);
    switch (id) {
    case (int) DIALOG_ALERT_SALIR:
        return new AlertDialog.Builder(this)
                .setIcon(R.drawable.icon_warning)
                .setTitle(R.string.warning)
                .setMessage(R.string.confsalir)
                .setPositiveButton(R.string.alert_dialog_ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {
                                if (batteryReceiver == null){   
                                }
                                else{
                                    try{
                                        unregisterReceiver(batteryReceiver);
                                    }catch(IllegalArgumentException iae){
                                    }
                                    batteryReceiver = null;
                                }           



                               Correccion();
                               Parseo();
                               reloj.cancel();
                               if (Titulacion.IsReachable1(getApplicationContext())){
                                new CreateResultados().execute();


                                }
                               EspacialTecnico.this.finish();
                               try {
                                    XMLResumen.escribirXMLResume();
                                } catch (FileNotFoundException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }}


                       })
                .setNegativeButton(R.string.alert_dialog_cancel,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {

                            }
                        })

                .create();
    }

    return null;

}

异步任务函数 错误可能是由对话框产生的吗?

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


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(EspacialTecnico.this);
            pDialog.setMessage("Transfiriendo...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }


        protected String doInBackground(String... args) {


            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("id", Ident.getDNI()));
            params.add(new BasicNameValuePair("nombre", Nombres.getNombre()));
            params.add(new BasicNameValuePair("tablet", Nombres.Tablet()));
            params.add(new BasicNameValuePair("fecha", Titulacion.fecha()));
            params.add(new BasicNameValuePair("test", nombre));
            params.add(new BasicNameValuePair("correctas", correctasString));
            params.add(new BasicNameValuePair("errores", fallosString));
            params.add(new BasicNameValuePair("PC", PC));



            JSONObject json = jsonParser.makeHttpRequest(url_crear_resultados,
                    "POST", params);
            Log.d("Create Response", json.toString());


            try {
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {


                } else {

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

            return null;
        }



        protected void onPostExecute(String file_url) {
            pDialog.dismiss();
        }
    }

有没有做过什么“坏事”?感谢您的帮助

最佳答案

此异常通常来自 Activity 结束时仍处于 Activity 状态的对话框。

onPreExecute() 中,您创建了一个新对话框,但可能 pDialog 已经包含对 Activity 对话框的引用。一些解决方法:

  • 在创建新的之前检查 pDialog == null。将 null 关闭后分配给 pDialog

  • 如果 pDialog != null,在创建新对话框之前先dismiss()它。

(此外,super.onCreateDialog() 是不必要的,因为您没有对返回的 Dialog 做任何事情。)

关于安卓错误 : Window Leaked in AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19155670/

相关文章:

java - Android - ASyncTask 错误 ThreadPoolExecutor

android - 将 Activity 上下文传递给构造函数以在内部使用 - 这很糟糕吗

android - 在Android中实现 "Thumbs down/Thumbs up"切换按钮的方法

android - 在 AsyncTask 中使用 runOnUiThread 是否效率低且不好?

java - 在后台加载数据,更新适配器?

Java 动态定义对象

api - 考虑 Policy.getPolicy() 的原因是什么,因为它将保留对上下文的静态引用并可能导致内存泄漏

jdbc - 为了防止内存泄漏,已强制注销JDBC驱动程序

android - 使用 ViewHolder 类在 getview() 中设置 onClickListener

Android Alarm AlarmManager提供的四种Alarm有什么区别,什么时候用什么?