2016-10-01 1 views
0

asynctask를 실행할 때 문제가 있습니다. 때때로 오류가 발생합니다. 예를 들어, asynctask를 20 번 실행하면 오류가 1 또는 2로 표시됩니다. 문제가 ProgressDialog (실행중인 대화 상자가 없을 때 닫으려는 시도)와 같지만 해결할 수 없었습니다.android.view.WindowLeaked on Asyctask

오류 로그는 말했다 :

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(); 
      } 
     } 
    } 
} 

내가 선 자바 오류로 이동하십시오 : (110)는, 이것이다

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를 내 코드입니다 라인 (preexecute) : this.dialog.show();

누군가 나를 도울 수 있습니까? 당신이 하나 이상의 비동기 작업 단계로있을 때 하나 이상의 AsyncTask를 다음 메커니즘

모두의

첫째는 정의하지 마십시오 onPreExceute()에서 dialog.show()와 onPostExecute() 같이 변경됩니다 진행 대화 상자 시작이있는 경우

+0

이 'Context'매개 변수 인 '활동'입니까? – nandsito

+0

@nandsito 예 ... –

+0

대화 상자를 닫고 ** onPostExecute() **의 첫 번째 문에 ** dialog.dismiss(); **가 있는지 확인하려면 조건을 제거하십시오. –

답변

0

단계 실행

메인 스레드에서이 일

시작 진행 대화 상자를 구현하려고하기보다는

AsyncTask를 (20)의 응답에서

해피 codding 작동합니다 시작하고 AsyncTask를

을 중지 할 필요 사이에서

mainThread

에서 진행 대화 상자를 닫습니다!

+0

하나의 작업 만 있습니다. 또한 다른 활동에서 asynctask를 호출하여 –

+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

, 나는 당신이 대화 상자를 표시하거나 마무리처럼 Activity의 장소에서 코드를 실행 AsyncTask들과 조심하는 것이 좋습니다 그것 때문에 AsyncTaskActivity 사이에 강력한 연결 고리를 만듭니다.작업이 작업과 비동기 적이기 때문에 AsyncTask이 백그라운드 작업을 마쳤을 때 Activity이 더 이상 존재하지 않을 때 또는 동일한 Activity에서 여러 AsyncTask이 동시에 발송되는 경우와 같이 일부 문제가 발생할 수 있습니다.