Empiezo a pensar que para que ProgressDialog funcione, la AsyncTask tiene que ser una clase interna dentro de una clase Activity. ¿Cierto? [Editado mucho más tarde ... la respuesta es False y no estoy seguro de si esto es un error o qué. Estoy usando Android 1.5. Voy a leer sobre Servicios.]ProgressDialog no funciona en AsyncTask externo
Tengo una actividad que usa una base de datos para manipular información. Si la base de datos está poblada, todo está bien. Si no está lleno, entonces necesito descargar información de un sitio web, rellenar la base de datos, luego acceder a la base de datos poblada para completar las Vistas en onCreate.
El problema es que sin algún medio para determinar cuándo el subproceso AsyncTask ha terminado de rellenar la base de datos, aparece el siguiente mensaje de error Forzar cierre: ¡Lo siento! La aplicación se detuvo inesperadamente. Hago clic en el botón Forzar cierre, el hilo AsyncTask de fondo continúa funcionando, la base de datos se llena y todo funciona bien.
Necesito deshacerme de ese mensaje de error y necesito ayuda sobre cómo hacer esto. He aquí algunos pseudo código:
public class ViewStuff extends Activity
{
onCreate
{
if(database is populated)
do_stuff
else
{
FillDB task = null;
if(task == null || task.getStatus().equals(AsyncTask.Status.FINISHED))
{
task = new FillDB(context);
task.execute(null);
}
}
continue with onCreate using information from database to properly display
} // end onCreate
} // end class
en un archivo separado:
public class FillDB extends AsyncTask<Void, Void, Void>
{
private Context context;
public FillDB (Context c) //pass the context in the constructor
{
context = c;
}
public void filldb()
{
doInBackground();
}
@Override
protected void onPreExecute()
{
ProgressDialog progressDialog = new ProgressDialog(context);
//crashes with the following line
progressDialog.show(context, "Working..", "Retrieving info");
}
@Override
protected Void doInBackground(Void... params)
{
// TODO Auto-generated method stub
try
etc etc etc
}
}
aquí está el seguimiento de la pila desde el emulador:
----- pid 846 at 2010-03-21 19:58:25 -----
Cmd line: com.trial
DALVIK THREADS:
"main" prio=5 tid=3 NATIVE
| group="main" sCount=1 dsCount=0 s=0 obj=0x40018e70
| sysTid=846 nice=0 sched=0/0 handle=-1098855268
at android.os.BinderProxy.transact(Native Method)
at android.app.ActivityManagerProxy.handleApplicationError(ActivityManagerNative.java:2103)
at com.android.internal.os.RuntimeInit.crash(RuntimeInit.java:302)
at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:75)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:887)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:884)
at dalvik.system.NativeStart.main(Native Method)
"Binder Thread #3" prio=5 tid=15 NATIVE
| group="main" sCount=1 dsCount=0 s=0 obj=0x43733d88
| sysTid=852 nice=0 sched=0/0 handle=1486928
at dalvik.system.NativeStart.run(Native Method)
"Binder Thread #2" prio=5 tid=13 NATIVE
| group="main" sCount=1 dsCount=0 s=0 obj=0x437313c8
| sysTid=851 nice=0 sched=0/0 handle=1492472
at dalvik.system.NativeStart.run(Native Method)
"Binder Thread #1" prio=5 tid=11 NATIVE
| group="main" sCount=1 dsCount=0 s=0 obj=0x4372b9b0
| sysTid=850 nice=0 sched=0/0 handle=1492664
at dalvik.system.NativeStart.run(Native Method)
"JDWP" daemon prio=5 tid=9 VMWAIT
| group="system" sCount=1 dsCount=0 s=0 obj=0x4372a2a0
| sysTid=849 nice=0 sched=0/0 handle=1490176
at dalvik.system.NativeStart.run(Native Method)
"Signal Catcher" daemon prio=5 tid=7 RUNNABLE
| group="system" sCount=0 dsCount=0 s=0 obj=0x4372a1e8
| sysTid=848 nice=0 sched=0/0 handle=1487888
at dalvik.system.NativeStart.run(Native Method)
"HeapWorker" daemon prio=5 tid=5 VMWAIT
| group="system" sCount=1 dsCount=0 s=0 obj=0x427d03c0
| sysTid=847 nice=0 sched=0/0 handle=1487592
at dalvik.system.NativeStart.run(Native Method)
----- end 846 -----
¿Qué estoy haciendo mal?
Sr. copo de nieve,
intentado:
@Override
protected void onPreExecute()
{
Activity.this.runOnUiThread(new Runnable() {
public void run() {
ProgressDialog progressDialog = new ProgressDialog(context);
//crashes with the following line
progressDialog.show(context, "Working..", "Retrieving info");
}
});
}
Activity.this se marca como un error: No se ejemplo encerrando del tipo de actividad es accesible en su alcance
Pienso I ¿Necesitas FillDB extends Activity y luego creas una clase privada dentro de FillDB extendiendo AsyncTask? Eso no funcionará. No se garantiza cuando se iniciará la actividad FillDB y no se puede usar startActivityForResult ya que no se devuelve ningún resultado de AsyncTask cuando se completa.
Actualización: Intenté crear una clase privada en la clase de llamada. Aún no puede mostrar un ProgressDialog. Uno de los errores es: no se puede agregar la ventana - token null no es para una aplicación. No tengo idea de a qué token se refiere.
Use 'adb logcat', DDMS o la perspectiva DDMS en Eclipse para observar el seguimiento de pila de Java asociado con el diálogo de cierre forzado, ya que ese seguimiento de pila debe proporcionarle más información sobre lo que está fallando. – CommonsWare
CommonsWare - No sé lo suficiente sobre adb para encontrar el seguimiento de pila en /data/anr/traces.txt. Pero mirando Logcat y DDMS en Eclipse parece que tengo una excepción de tiempo de ejecución no detectada. java.lang.reflect.InvocationTarget Excepción java.lang.Runtime Excepción WindowMai intentó añadir ventana con la no aplicación símbolo WindowToken (43711b88 token = null) Abortar. miré para ver si el contexto era nula y no parece ser: this.context espectáculos: contexto \t android.app.Application (id = 830060323048) – eric
¿Qué ocurre con el cuadro de diálogo, si cambia entre modo horizontal/vertical mientras se está ejecutando la tarea? ¿Es seguro crear el diálogo en Runnable usando runOnUiThread (...)? –