with onpostexecute example asynctask activity android android-asynctask progressdialog

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 primera Activity y pasarlos como extra a la segunda. Esto realmente no funcionó bien ya que el ProgressDialog que creé en onPreExecute() no se onPreExecute() inmediato (parece retrasado por el procesamiento realizado en doInBackground() 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(); } }



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.