Pregunta

Me estoy empezando a pensar que para obtener un ProgressDialog para trabajar la AsyncTask tiene que ser una clase interna dentro de una clase de actividad. ¿Cierto? [Editado mucho más tarde ... la respuesta es falsa y no estoy seguro si esto es un error o qué. Estoy usando Android 1.5. Voy a leer sobre Servicios.]

Tengo una actividad los usos una base de datos para manipular la información. Si la base de datos se rellena todo está bien. Si no se rellena entonces necesito para descargar información de un sitio web, poblar la base de datos, a continuación, acceder a la base de datos de población para completar las Vistas en onCreate.

El problema es que sin algún medio para determinar cuándo el hilo AsyncTask ha terminado de llenar la base de datos, me sale el siguiente mensaje de error Fuerza de Cierre: Lo siento! La aplicación se ha detenido de forma inesperada. Hago clic en el botón Cerrar de la fuerza, el hilo de fondo AsyncTask sigue trabajando, la base de datos se rellena, y todo funciona bien.

necesito para deshacerse de ese mensaje de error y necesita un poco de 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?

Mr. Copo de nieve,

Probado:

@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: Ningún caso de que encierra el tipo de actividad es accesible en su alcance

Pienso que necesito FillDB extiende Actividad a continuación, crear una clase privada dentro FillDB extendiéndose AsyncTask? Esa costumbre' trabajo. No existen garantías de que la actividad se iniciará FillDB y no puede utilizar startActivityForResult ya no devuelve ningún resultado de AsyncTask cuando se haya completado.

Actualización: intentado crear una clase privada en la clase de llamadas. Todavía no se puede mostrar un ProgressDialog. Uno de los errores es la siguiente: No se puede agregar ventana - nula ficha no es para una aplicación. No tengo ni idea de qué token se hace referencia.

¿Fue útil?

Solución 2

Me di por vencido en AsyncTask y se utiliza un manejador para manejar el hilo de rosca. Todo es bueno.

No está seguro de si se trata de un error en 1,5 con AsyncTask o alguna otra cosa que no hice.

Otros consejos

¿Ha considerado reemplazando el método onCreateDialog () para poner en práctica sus diálogos? Es fácil de crear y controlar ellos de esta manera como Android hace casi todo el trabajo por usted. Tengo un ejemplo a continuación haciendo exactamente lo que estás tratando de hacer.

http://pastie.org/880540

Yo estaba teniendo el mismo problema que la OP durante bastante tiempo con un público (externa) AsyncTask. Cuando la investigación sobre el mensaje de error "intentó añadir ventana con fichas no aplicación", descubrí que el problema está en establecer el contexto que se pasa en el constructor de la AsyncTask. El contexto en el que debe pasar es "esto", no this.getApplicationContext () o this.getBaseContext (). Que se resolvió mi problema.

Trate de ejecutar

   ProgressDialog progressDialog = new ProgressDialog(context);
   //crashes with the following line
   progressDialog.show(context, "Working..", "Retrieving info");

como un ejecutable como argumento para Activity.runOnUiThread (). elementos de la interfaz de usuario deben ser creados y manipulados en el hilo de interfaz de usuario. Creo que esto también es cierto para Dialogs.

[editar] Código:

Activity.this.runOnUiThread(new Runnable() {
  public void run() {
    ProgressDialog progressDialog = new ProgressDialog(context);
    //crashes with the following line
    progressDialog.show(context, "Working..", "Retrieving info");
  }
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top