studio que oncancelled implement hilos create asynctask async android android-asynctask

que - implement asynctask android



AsyncTask onPostExecute nunca se llama (8)

No estoy seguro de lo que estoy haciendo mal, pero nunca se llama a OnPostExecute.

  • Creó una clase base llamada BaseActivity.java.
  • De mi Actividad original extendí esta clase.
  • Colocada clase PostToOpenFeint dentro de BaseActivity
  • Lo llamé desde el hilo de la interfaz de usuario desde la actividad principal que estoy haciendo:

    new PostToOpenFeint.execute();

OnPreExecute (), doInBackground (..) se activa, pero por alguna razón nunca se llama a onPostExecute.

¡Gracias de antemano!

Dave

private class PostToOpenFeint extends AsyncTask<Void, Void, Void> { /* * (non-Javadoc) * * @see android.os.AsyncTask#doInBackground(Params[]) */ @Override protected Void doInBackground(Void... params) { // does all the work here return null; } /* * (non-Javadoc) * * @see android.os.AsyncTask#onPostExecute(java.lang.Object) */ @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); Toast.makeText(MainScreen.this, "Done syncing", Toast.LENGTH_LONG).show(); } /* * (non-Javadoc) * * @see android.os.AsyncTask#onPreExecute() */ @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); Toast.makeText(MainScreen.this, "About to sync all your scores", Toast.LENGTH_LONG).show(); }

Mirándolo más, esto es lo que pude observar. Por ejemplo si hago esta llamada:

new PostToOpenFeint.execute();

Justo después de onCreate of the Activity, entonces todo funciona bien. Si hago esta llamada digamos dentro de un oyente de botones.

settingsButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { new PostToOpenFeint.execute(); } });

El onPostExecute () nunca recibe llamadas, no estoy seguro de lo que estoy haciendo mal. La restricción que leí era que lo llamara desde el hilo de la interfaz de usuario y lo estoy llamando desde el hilo de la interfaz de usuario.


Hay una pregunta más sobre AsyncTasks que acabo de pasar la mitad del día:

La clase AsyncTask se debe cargar en el subproceso de la interfaz de usuario. Esto se hace automáticamente a partir de JELLY_BEAN.

Dice la documentación. En Gingerbread (y probablemente antes), dadas las circunstancias correctas, esto lleva a que no se ejecute onPostExecute . La solución, sin embargo, es fácil, solo un

new MyAsyncTask();

al principio del subproceso de la interfaz de usuario para que la clase se cargue antes de que cualquier cosa en segundo plano pueda cargarla inadvertidamente.

Había usado una función estática en mi subclase de AsyncTask desde un subproceso de fondo que, según el tiempo, se llamó antes que cualquier subproceso de la interfaz de usuario usara esa subclase de AsyncTask, y el bingo, un bonito Heisenbug.

(Tenga paciencia conmigo para responder esta vieja pregunta ya contestada, pero no encontré esa información en ningún sitio, y esta es mi primera publicación)


Mi problema fue que de alguna manera no omití el método onPostExecute correctamente. Arreglé eso haciendo clic con el botón derecho del mouse-> fuente-> Anular / Implementar método.

Espera que ayude a alguien.


Simplemente agregue esto al Código a su actividad. Es el problema de que la tarea asíncrona no se inicialice correctamente como se supone que debe hacer.

try { Class.forName("android.os.AsyncTask"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }


Simplemente use los Parámetros adecuados en onPostExecute, use public void onPostExecute (respuesta booleana) {} en lugar de public void onPostExecute (boolean response) {} esto solucionó mi problema


Solo cambia los parámetros en onPostExecute

@Override protected void onPostExecute(Void unused) { ...}

Ahora el método debería ser llamado.


Tal vez el código en doInBackground () nunca devuelve?


Tenga en cuenta que si cancela la tarea mediante cancel() , no se llamará a onPostExecute() . Bastante lógico, pero simplemente pasar por alto una llamada a ese método me dejó perplejo.


Tuve un problema similar justo ahora. Estaba extendiendo AsyncTask<Integer,Integer,Integer> y mi método onPostExecute se parecía a:

protected void onPostExecute(int result)

Esto me pareció bien, pero de nuevo soy más un tipo .NET que un tipo Java. Lo cambié a

protected void onPostExecute(Integer result)

¿Porque, por alguna razón, Java cree que hay una diferencia entre int y Integer ?

Creo que su problema es que está declarando el tipo de retorno como void en su:

extends<Void,Void,Void>

Eso significa que no hay parámetros, no hay progreso y no hay resultados. Si quieres ejecutar algo cuando está hecho, creo que necesitas darle algún tipo de valor como un entero o un booleano.

Si cambias tu extensión a:

<Void,Void,Integer>

Ahora no está pasando ningún parámetro, no está publicando ningún progreso, pero está devolviendo un valor. Cambie su método onPostExecute para aceptar un Integer :

protected void onPostExecute(Integer result)

Luego cambia el retorno en tu método doInBackground a algo como:

return 1;

Entonces debería ejecutarse por ti.