2016-10-01 6 views
0

У меня проблема при попытке запуска asynctask. Ошибка появляется иногда, например, если я запускаю 20-кратное значение асинтетики, появляется ошибка 1 или 2. Я думаю, проблема связана с ProgressDialog (попытка закрыть, когда нет диалога), но я не мог ее решить.android.view.WindowLeaked at Asyctask

Журнал ошибок сказал:

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) 

Это мой код моего AsyncTask от CalcularHorariosDisponiblesComplejo.java:

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, это line (on preexecute): this.dialog.show();

Кто-нибудь может мне помочь?

+0

- это параметр 'Context' и' Activity'? – nandsito

+0

@nandsito yes ... –

+0

удалить условие, чтобы отклонить диалог и убедиться, что у вас есть ** dialog.dismiss(); ** в первом утверждении ** onPostExecute() **; –

ответ

0

, если у вас есть более чем один AsyncTask затем запустить Progress Dialog механизм будет изменен, как

Прежде всего не Defined dialog.show() в onPreExceute() и onPostExecute(), когда у вас есть более чем одну задачу в асинхронном режиме и шаг за выполнение шага

Вместо того, чтобы попытаться осуществить это вещи

Start Progress Dialog в основном потоке

 Start Asynctask 1 
     Start Asynctask 2 

     Start Asynctask 20 

В ответе AsyncTask 20 смещать диалог Прогресс в mainThread

Между без необходимости запуска и остановки AsyncTask

он будет работать

Happy codding !!!

+0

У меня есть только одна задача. Также вы вызываете асинтексу из другой активности, отправляя контекст –

+0

, поэтому я не понимаю, с какими проблемами вы столкнулись? –

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

В этом проблема. Поместите его в начале вашего onPostExecute()

+0

Все еще проблема –

0

человек, вы убиваете активность, а затем пытаетесь закрыть диалог, сначала выполните все действия в действии, а затем в конце концов убейте вас. здесь первым это:

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

и только тогда

((Activity)context).finish(); 

кузен для теперь вы убили активность, а затем вы пытаетесь закрыть окно в не существует активности.

+0

Ну ... все еще происходит ... иногда .... –

+0

Я полагаю, вы несколько раз вызываете эту задачу? если это так, вы должны подсчитать экземпляры, которые вы вызывали в некотором значении (увеличение на старт и уменьшение при остановке) - и убить активность только тогда, когда последний экземпляр завершит работу –

0

Ваша проблема хорошо описана здесь:

Activity has leaked window that was originally added

В общем, я предлагаю вам позаботиться с AsyncTask с, которые выполняют код вместо с Activity, как показывает диалоговые окна или отделки его, потому что он создает прочную связь между AsyncTask и Activity.И поскольку задача является асинхронной к активности, некоторые проблемы могут возрасти, например, когда Activity больше не существует, когда AsyncTask заканчивает свою фоновую работу, или когда несколько AsyncTask s отправляются из одного и того же Activity одновременно.