2012-04-04 11 views
7

Estoy desarrollando una aplicación de Android que requiere el uso de AsyncTask para la conexión de red. Lo llamé desde el hilo principal. Por lo tanto, el método doInBackground se ejecuta y luego vuelve al método onPostExecute. Después de ejecutar el método onPostExecute, deseo devolver un valor a la actividad desde donde se invocó, ya que tengo que realizar alguna operación en esa actividad particular que requiere el valor devuelto por el método onPostExecute. ¿Cómo soluciono esto? ¿Cómo devuelvo un valor desde onPostExecute?¿Puede el método OnPostExcecute en los valores de RETORNO AsyncTask?

Gracias de antemano

+0

ver http://stackoverflow.com/questions/5457493/asynctask-return-value y http://stackoverflow.com/questions/5457493/asynctask-return-value – ngesh

+0

[Ver esta respuesta] (http: // stackoverflow.com/questions/7618614/return-data-from-asynctask-class/7618705#7618705) –

Respuesta

8

AsyncTask, como su nombre lo indica, se ejecuta de forma asíncrona con hilo de interfaz de usuario, se llamará al método onPostExecute en algún momento en el futuro, cuando doInBackground finalizó. No nos importa cuándo se llamará al método onPostExecute (en realidad no hay forma de saber cuándo se construye el proyecto), lo único que nos importa es que el método subyacente se garantice que el framework subyacente llamará adecuadamente en algún momento en el futuro. Por lo tanto, el propósito del método onPostExecute es procesar el resultado devuelto desde el hilo del trabajador, esta es la razón por la cual el único argumento del método onPostExecute es el resultado devuelto por el método doInBackground.

Tengo alguna operación en esa actividad particular que requiere el valor devuelto por el método onPostExecute. ¿Cómo puedo solucionar esto?

Por causa, puede crear algunas variables de instancia (o usar el patrón listerner) en la clase de actividad almacenar el resultado cuando se devuelve y listo en el método onPostExecute. El problema es que nunca se sabe cuando este resultado está listo fuera del método PostExecute en el momento de compilación del proyecto, ya que en realidad se determina en el tiempo de ejecución de la aplicación. A menos que escriba algún mecanismo de espera continuamente sondeando el resultado, lo que resultará en el beneficio de AsyncTask, por ejemplo, la API integrada AsyncTask.get() que hace que AsyncTask se ejecute de forma síncrona con el subproceso UI y devuelva el resultado a la Actividad.

La mejor práctica es cambiar el diseño y mover el código de operación que requiere el resultado devuelto por AsyncTask en el método onPostExecute. espero que esto ayude.

+0

@ManJan, he respondido una pregunta similar recientemente [aquí] (http://stackoverflow.com/questions/10115243/after-asynctask-execute-do-x-from-activity/10115881 # 10115881) explique más detalles sobre cómo funciona AsyncTask con el hilo de UI, espero que esto ayude. – yorkw

5

puede utilizar get y set para obtener el valor de vuelta de AsyncTask

public class MainActivity extends Activity { 
    public String retunnumfromAsyncTask; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.layouttest); 
     new Asyntask(this).execute(); 
    } 

    public class Asyntask extends AsyncTask<Void, Void, String> { 
     private final Context Asyntaskcontext; 

     public Asyntask(Context context){ 
      Asyntaskcontext = context; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      MainActivity mainactivity = (MainActivity) Asyntaskcontext; 
      mainactivity.retunnumfromAsyncTask = result;  
      super.onPostExecute(result); 
     } 
    } 
} 
1

Simplemente escriba la clase AsyncTask como clase interna para su actividad y luego, declare el valor que desee devolver como global. ¿Fue de ayuda para ti?

Cuestiones relacionadas