尝试运行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();
有人可以帮助我吗?
答案 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
发送。