mi problema es el mismo que este Instance variable of Activity not being set in onPostExecute of AsyncTask or how to return data from AsyncTask to main UI thread pero quiero enviar los datos a la misma actividad de llamada. Doesnt startActivity for intents siempre reinicia la actividad¿cómo puedo enviar datos de onPostExecute en una AsyncTask?
Respuesta
En opción es utilizar los oyentes, donde se crea una interfaz que sus implents actividad, algo así como:
public interface AsyncListener {
public void doStuff(MyObject obj);
}
De esta manera, si estás de subclases AsyncTask, es fácil añadir este oyente, a continuación, en onPostExecute(), usted podría hacer algo como:
protected void onPostExecute(MyObject obj) {
asyncListener.doStuff(obj);
}
Esto depende de la estructura de tu clase, pero si tu AsyncTask es una clase dentro de tu actividad, entonces puedes hacer referencia a los métodos de esa actividad. Lo que se puede hacer es en su método onPostExecute llamar a una función de la actividad que pasa algunos datos que se recuperaron en el AsyncTask a la actividad en la que a continuación se puede utilizar ..
El código se vería así
class YourActivity extends Activity {
private static final int DIALOG_LOADING = 1;
public void onCreate(Bundle savedState) {
setContentView(R.layout.yourlayout);
showDialog(DIALOG_LOADING);
new LongRunningTask1().execute(1,2,3);
}
protected Dialog onCreateDialog(int dialogId) {
switch(dialogId) {
case DIALOG_LOADING:
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setTitle("Loading Data");
pDialog.setMessage("Loading Data, please wait...");
return pDialog;
default:
return super.onCreateDialog(dialogId);
}
}
private void onBackgroundTaskDataObtained(List<String> results) {
dismissDialog(DIALOG_LOADING);
//do stuff with the results here..
}
private class LongRunningTask extends AsyncTask<Long, Integer, List<String>> {
@Override
protected void onPreExecute() {
//do pre execute stuff
}
@Override
protected List<String> doInBackground(Long... params) {
List<String> myData = new ArrayList<String>();
for (int i = 0; i < params.length; i++) {
try {
Thread.sleep(params[i] * 1000);
myData.add("Some Data" + i);
} catch(InterruptedException ex) {
}
}
return myData;
}
@Override
protected void onPostExecute(List<String> result) {
YourActivity.this.onBackgroundTaskDataObtained(result);
}
}
}
El flujo típico es así, configure la vista de la página actual y luego muestre un cuadro de diálogo de progreso. Inmediatamente después de que comience la tarea asincrónica (o cuando sea, realmente no importa).
Una vez completada su tarea de sincronización, llame a una función de la actividad y páselo. No use datos compartidos dentro de la tarea asíncrona o corre el riesgo de problemas con el subprocesamiento. En cambio, una vez que haya terminado, hágalo pasar a la actividad. Si desea actualizar la vista progresivamente mientras se hace el trabajo se puede utilizar en onProgressUpdate
- 1. onPostExecute en AsyncTask cancelado
- 2. Async task android onPostExecute
- 3. AsyncTask para actualizar el widget: ¿cómo acceder a textviews en onPostExecute()?
- 4. Android AsyncTask partir Otra AsyncTask
- 5. ¿Cómo puedo depurar código DoInBackground de una AsyncTask
- 6. onPostExecute no se llama
- 7. Android AsyncTask devuelve varios valores en doInBackground para ser utilizado en onPostExecute
- 8. ¿Cómo recuperar una cadena de AsyncTask?
- 9. AsyncTask onPostExecute() no llamado en la Unidad de Caso de Prueba
- 10. Cómo pasar datos de AsyncTask a Ui Thread
- 11. Devolver datos de AsyncTask Android
- 12. ¿Cómo puedo enviar datos binarios de Sinatra?
- 13. Android AsyncTask dentro de AsyncTask
- 14. AsyncTask: pase de dos o más valores de doInBackground a onPostExecute
- 15. ¿Cómo paso un contexto a una AsyncTask?
- 16. Android: ¿Cómo puedo pasar los parámetros a OnPreExecute() de AsyncTask?
- 17. ¿Cómo puedo enviar datos JSON al servidor
- 18. Android: ¿Cómo actualizar una interfaz de usuario de AsyncTask si AsyncTask está en una clase separada?
- 19. Android, ¿puedo poner AsyncTask en una clase separada y tener una devolución de llamada?
- 20. ¿Cuánto tiempo puedo retener un ContentResolver en una AsyncTask?
- 21. ¿Puede el método OnPostExcecute en los valores de RETORNO AsyncTask?
- 22. ¿Cómo puedo enviar datos de regreso usando finish?
- 23. ¿Es posible usar AsyncTask en una clase de servicio?
- 24. android.os.NetworkOnMainThreadException en AsyncTask
- 25. Clase común para AsyncTask en Android?
- 26. ¿Cómo puedo enviar datos POST y navegar con JQuery?
- 27. Actualización de diálogo en la Actividad de AsyncTask
- 28. Android reiniciar AsyncTask
- 29. Catch Exception of AsyncTask. Need Thinking
- 30. AsyncTask y Contexts
Gracias por su respuesta. No soy fanático de que AsyncTask se use como una subclase. Creo que deberías poder usar eventos. Creo que la respuesta es usar intenciones, pero esto solo creará una nueva instancia de mi actividad que no quiero. – skinnybrit51
Puede usar fácilmente su AsyncTask en su propia clase, pero eso solo es útil si usa la misma lógica de múltiples actividades diferentes. En ese caso, podría: 1. usar una clase base común (no actividad, sino algo que se extienda) actividad) y luego tendría un método común que podría llamarse desde la tarea asincrónica. O mejor aún, pídales que implementen una interfaz común que tenga la devolución de llamada tal como lo describí. Pase una referencia a la actividad en el constructor de AsyncTask y asegúrese de que asyncTask tenga un constructor que tome un parámetro del tipo de interfaz. –
Su última opción es abandonar AsyncTask por completo y poner esto en un servicio que necesita para crear un nuevo hilo para hacer la actividad de fondo (ya que los servicios no se ejecutarán en su propio hilo por defecto). Una manera fácil de hacerlo es crear un IntentService que cree un nuevo hilo para usted. –