onpostexecute - asynctask with progressdialog android example
Mostrar una barra de progreso cuando se carga una actividad (3)
Tengo una ListActivity
que lanza otra Activity
basada en la selección de la lista. Esta segunda Activity
necesita cargar un poco de datos de Internet y, como tal, hay un retraso notable entre el momento en que el usuario hace clic en un elemento y cuando se muestra la Activity
.
Esto es un problema porque actualmente no tengo forma de indicarle al usuario que se está procesando su clic (incluso con solo cambiar el color del elemento de la lista seleccionado sería suficiente, pero no puedo encontrar una buena manera de hacerlo). Lo ideal sería poder mostrar un ProgressDialog
indeterminado mientras se carga la segunda Activity
.
He intentado algunos enfoques diferentes para esto, pero nada parece funcionar como se desea.
He intentado lo siguiente:
- Recuperar los datos serializables (no todos, sino parte de ellos) en una
AsyncTask
en la primeraActivity
y pasarlos como extra a la segunda. Esto realmente no funcionó bien ya que elProgressDialog
que creé enonPreExecute()
no seonPreExecute()
inmediato (parece retrasado por el procesamiento realizado endoInBackground()
por alguna razón).
Aquí está el código para eso:
AsyncTask<String, Void, String> read = new AsyncTask<String, Void, String>() {
Dialog progress;
@Override
protected void onPreExecute() {
progress = ProgressDialog.show(SearchActivity.this,
"Loading data", "Please wait...");
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
DatasetReader reader = new DatasetReader();
reader.setFundID(params[0]);
reader.addDatsets(FundProfile.datasets);
reader.populate();
return reader.toString();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
progress.dismiss();
}
};
read.execute(selectedItem.getUniqueID());
try {
action = new Intent(SearchActivity.this, FundProfile.class);
action.putExtra("data", read.get());
} catch(Exception ex) {
ex.printStackTrace();
}
En el método
onCreate()
la segunda actividad (esto no funciona en absoluto):requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setProgressBarVisibility(true);
Aquí está el método onCreate()
para el segundo enfoque:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setTitleColor(Color.WHITE);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setProgressBarVisibility(true);
try {
setContentView(R.layout.fund_profile);
// init some data
setProgressBarVisibility(false);
} catch(Exception ex) {
FundProfile.this.finish();
}
}
Adán,
Parece que está buscando la barra de progreso indeterminado: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar2.html
Puede mostrar esto mientras está cargando su segunda Activity
luego configurar la visibilidad en falso una vez que la segunda Activity
haya cargado sus datos.
Mueva la creación de la Intención, y realmente todo lo que necesita hacer después de completar AsyncTask, en onPostExecute:
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
progress.dismiss();
Intent action = new Intent(SearchActivity.this, FundProfile.class);
action.putExtra("data", result);
// ... do more here
}
El problema es que AsyncTask.get () bloquea hasta que se completa la tarea. Por lo tanto, en el código anterior, el subproceso de la interfaz de usuario está bloqueado y el ProgressDialog nunca tiene la oportunidad de aparecer hasta que la tarea finalice.
Si tiene operaciones largas, no debería realizarlas en onCreate en ningún caso, ya que esto congelará la interfaz de usuario (se muestre o no la actividad). La IU establecida por onCreate no aparecerá y la IU no responderá hasta después de que finalice la llamada onCreate.
Parece que puede iniciar su segunda actividad y mostrar una barra de progreso (o requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
), luego iniciar una ASyncTask que será responsable de actualizar su UI una vez que se hayan recuperado los datos.