getintextra - intentfilter android
¿Cómo devuelvo datos desde onPostExecute en una AsyncTask? (2)
La opción es usar oyentes, donde se crea una interfaz que implementa su actividad, algo así como:
public interface AsyncListener {
public void doStuff( MyObject obj );
}
De esta forma, si está subclasificando AsyncTask, es fácil agregar este oyente, luego en onPostExecute (), podría hacer algo como:
protected void onPostExecute( MyObject obj ) {
asyncListener.doStuff(obj);
}
mi problema es el mismo que esta variable de instancia de actividad que no se establece en onPostExecute de AsyncTask o cómo devolver datos de AsyncTask a la hebra de interfaz de usuario principal, pero quiero enviar los datos a la misma actividad de llamada. Doesnt startActivity for intents siempre reinicia la actividad
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 haría en su método onPostExecute es llamar a una función de su actividad que transfiera algunos datos que se recuperaron en AsyncTask a la actividad en la que puede usarlos.
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);
}
}
}
Entonces, el flujo típico es así, establece la vista de la página actual y luego muestra un cuadro de diálogo de progreso. Inmediatamente después de que comience la tarea asincrónica (o cuando sea, realmente no importa).
Después de que se complete su tarea de sincronización, llame a una función de la actividad y pase los datos. No use datos compartidos dentro de la tarea asíncrona o arriesgue problemas con el subprocesamiento. En cambio, una vez que haya terminado, hágalo pasar a la actividad. Si desea actualizar la vista de forma progresiva mientras trabaja, puede usar onProgressUpdate