android.view.WindowLeaked on Asyctask

时间:2016-10-01 11:38:34

标签: android android-asynctask progressdialog

尝试运行asynctask时遇到问题。有时会出现错误,例如,如果我运行20次asynctask错误出现1或2。 我认为问题出在ProgressDialog上(当没有Dialog运行时试图关闭)但是我无法解决它。

错误日志说:

E/WindowManager: android.view.WindowLeaked: Activity com.app.GestionarTurnos has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{26d38b91 V.E..... R......D 0,0-160,180} that was originally added here
                                                                           at android.view.ViewRootImpl.<init>(ViewRootImpl.java:375)
                                                                           at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:271)
                                                                           at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
                                                                           at android.app.Dialog.show(Dialog.java:298)
                                                                           at com.app.CalcularHorariosDisponiblesComplejo$CalcularHorariosComplejoAsyncTask.onPreExecute(CalcularHorariosDisponiblesComplejo.java:110)

这是我从CalcularHorariosDisponiblesComplejo.java获取asynctask的代码:

public MyAsyncTask(Context context, String idComplejoSeleccionado, String idCancha, String nombreComplejo, String idUsuarioComplejo, String idPais, String dia, String mes, String anio) {
        super();
        this.context = context;
        this.idComplejoSeleccionado = idComplejoSeleccionado;
        this.idCanchaSeleccionada = idCancha;
        this.nombreComplejo = nombreComplejo;
        this.idUsuarioComplejo = idUsuarioComplejo;
        this.idPais = idPais;
        this.dia = Integer.parseInt(dia);
        this.mes = Integer.parseInt(mes);
        this.anio = Integer.parseInt(anio);

        Calendar cl = Calendar.getInstance(TimeZone.getTimeZone(String.valueOf(65)));
        cl.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dia));
        cl.set(Calendar.MONTH, Integer.parseInt(mes));
        cl.set(Calendar.YEAR, Integer.parseInt(anio));
        this.dayOfWeek = cl.get(Calendar.DAY_OF_WEEK);

        dialog = new ProgressDialog(context, R.style.ProgressDialogTheme);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        this.dialog.show();
    }
    protected String doInBackground(String... args) {
        jsonCalcularHorariosComplejo = null;
        fechaSeleccionada = (String.valueOf(anio)) + "-" + (String.valueOf(mes + 1)) + "-" + (String.valueOf(dia));

        try {
            jsonCalcularHorariosComplejo = JSONParser.readJsonFromUrl(url.concat(fechaSeleccionada+"&idCancha="+idCanchaSeleccionada+"&idUsuario="+idUsuarioComplejo+"&idComplejo="+idComplejoSeleccionado+"&dayOfWeek="+dayOfWeek+"&idPais="+idPais));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
    protected void onPostExecute(String file_url) {
        if (!esCancelado) {
            if(jsonCalcularHorariosComplejo == null){
                Toast toast = Toast.makeText(context, "Not possible connect with the server. Try it again", Toast.LENGTH_LONG);
                toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
                toast.show();
                Intent intent = new Intent(context, SeleccionarCanchaComplejo.class);
                intent.putExtra("idComplejo", idComplejoSeleccionado);
                intent.putExtra("nombreComplejo", nombreComplejo);
                intent.putExtra("idPais", idPais);
                intent.putExtra("idUsuarioComplejo", idUsuarioComplejo);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                context.startActivity(intent);
                ((Activity)context).finish();
            }
            else{
                try {
                    // Verifica que se cargaron datos
                    int success;
                    success = jsonCalcularHorariosComplejo.getInt(TAG_SUCCESS);
                    if (success == 1) {
                        diaHoy = Integer.parseInt(jsonCalcularHorariosComplejo.getString(TAG_DIAHOY));
                        mesHoy = Integer.parseInt(jsonCalcularHorariosComplejo.getString(TAG_MESHOY));
                        anioHoy = Integer.parseInt(jsonCalcularHorariosComplejo.getString(TAG_ANIOHOY));
                        horaActual = jsonCalcularHorariosComplejo.getString(TAG_HORA);
                        todosLosTurnos = jsonCalcularHorariosComplejo.getJSONArray(TAG_TODOS_LOS_TURNOS);

                        for (int i = 0; i < todosLosTurnos.length(); i++) {
                            turnoAux = todosLosTurnos.getJSONObject(i);
                            // Guardo en variables los datos del objeto
                            String hora = turnoAux.getString(TAG_HORA);
                            int canchaFK = Integer.parseInt(turnoAux.getString(TAG_CANCHAFK));
                            int usuarioFK = Integer.parseInt(turnoAux.getString(TAG_USUARIOFK));
                            int reservado = Integer.parseInt(turnoAux.getString(TAG_RESERVADO));
                            String fecha = turnoAux.getString(TAG_FECHA);
                            String nombreAuxiliar = turnoAux.getString(TAG_NOMBREAUXILIAR);
                            int noAsistio = Integer.parseInt(turnoAux.getString(TAG_NOASISTIO));
                            String fechaDeReserva = turnoAux.getString(TAG_FECHADERESERVA);
                            String telefonoAux = turnoAux.getString(TAG_TELEFONO);
                            String estado = turnoAux.getString(TAG_ESTADO);
                            Turno turno = new Turno(hora, canchaFK, usuarioFK, reservado, fecha, nombreAuxiliar, noAsistio, fechaDeReserva, telefonoAux, estado);
                            todosMisTurnos.add(turno);
                        }
                    }
                }catch (JSONException e) {
                    e.printStackTrace();
                }
                Intent intent = new Intent(context, Gestionar.class);
                intent.putExtra("todosMisTurnos", (ArrayList<Turno>) todosMisTurnos);
                intent.putExtra("idComplejo", idComplejoSeleccionado);
                intent.putExtra("idCancha", idCanchaSeleccionada);
                intent.putExtra("nombreComplejo", nombreComplejo);
                intent.putExtra("idUsuarioComplejo", idUsuarioComplejo);
                intent.putExtra("idPais", idPais);
                intent.putExtra("dia", String.valueOf(dia));
                intent.putExtra("mes", String.valueOf(mes));
                intent.putExtra("anio", String.valueOf(anio));
                intent.putExtra("diaHoy", String.valueOf(diaHoy));
                intent.putExtra("mesHoy", String.valueOf(mesHoy));
                intent.putExtra("anioHoy", String.valueOf(anioHoy));
                intent.putExtra("horaActual", horaActual);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                ((Activity)context).finish();
                context.startActivity(intent);
            }
            if (dialog.isShowing()) {
                dialog.dismiss();
            }
        }
    }
}

当我转到行java:110中的错误时,是这行(在preexecute上):     this.dialog.show();

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:0)

如果您有多个AsyncTask,则启动Progress Dialog机制将更改为

当您有多个异步任务并逐步执行时,onPreExceute()onPostExecute()中的

首先不要定义dialog.show()

而不是尝试实现这一点

在主线程中启动进度对话框

      Start Asynctask 1
      Start Asynctask 2

      Start Asynctask 20

在Asynctask 20的响应中,取消mainThread中的Progress对话框

之间无需启动和停止asynctask

它会起作用

快乐编码!!!

答案 1 :(得分:0)

if (dialog.isShowing()) {
            dialog.dismiss();
        }

这就是问题所在。把它放在你的onPostExecute()

的开头

答案 2 :(得分:0)

男人,你正在杀死活动,然后尝试关闭对话框,首先在活动中执行所有操作,然后在最后杀死你的活动。 首先是这个:

        context.startActivity(intent);
    }
    if (dialog.isShowing()) {
        dialog.dismiss();
    }

然后才

((Activity)context).finish();

因为你现在已经杀死了活动,然后你试图在非存在的活动中关闭对话框。

答案 3 :(得分:0)

你的问题在这里有详细描述:

Activity has leaked window that was originally added

一般情况下,我建议您注意使用代替AsyncTask执行代码的Activity,例如显示对话框或完成代码,因为它会在{{1}之间创建强大的链接}和AsyncTask。并且,由于任务与活动异步,因此某些问题可能会增加,例如,当Activity完成其后台工作时Activity不再存在,或者多个AsyncTask是同时从同一AsyncTask发送。