La tarea de ASync de Android ProgressDialog no se muestra hasta que finaliza el archivo de fondo

Tengo una actividad de Android que agarra una fuente RSS de una URL, y utiliza el analizador SAX para pegar cada elemento del XML en una matriz. Todo esto funciona bien, pero, como era de esperar, toma un poco de tiempo, así que quiero utilizar AsyncActivity para hacerlo en segundo plano. Mi código es el siguiente:

class AddTask extends AsyncTask<Void, Item, Void> { protected void onPreExecute() { pDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Retrieving data ...", true); } protected Void doInBackground(Void... unused) { items = parser.getItems(); for (Item it : items) { publishProgress(it); } return(null); } protected void onProgressUpdate(Item... item) { adapter.add(item[0]); } protected void onPostExecute(Void unused) { pDialog.dismiss(); } } 

Lo que yo llamo onCreate() con

 new AddTask().execute(); 

Los items = parser.getItems() línea items = parser.getItems() funcionan bien – los items son el arraylist que contiene cada elemento del XML. El problema que estoy enfrentando es que al iniciar la actividad, el ProgressDialog que creo en onPreExecute() no se muestra hasta después de que el método doInBackground() ha terminado. es decir, obtengo una pantalla en negro, una pausa larga y luego una lista completamente poblada con los elementos. ¿Por qué sucede esto? ¿Por qué no se muestra el dibujo de la interfaz de usuario, la muestra ProgressDialog, el analizador obtiene los elementos y los agrega gradualmente a la lista y, a continuación, la eliminación de ProgressDialog?

Esto funciona para mi

 @Override protected void onPreExecute() { dialog = new ProgressDialog(viewContacts.this); dialog.setMessage(getString(R.string.please_wait_while_loading)); dialog.setIndeterminate(true); dialog.setCancelable(false); dialog.show(); } 

Sospecho que algo está bloqueando su interfaz de usuario después de ejecutar la tarea. Por ejemplo, he visto gente hacer cosas como esta:

 MyTask myTask = new MyTask(); TaskParams params = new TaskParams(); myTask.execute(params); myTask.get(5000, TimeUnit.MILLISECONDS); 

La invocación aquí va a bloquear el hilo de la interfaz de usuario (que presumiblemente está girando fuera de la tarea aquí …) que evitará cualquier material relacionado con la interfaz de usuario en el método onPreExecute () de su tarea hasta que la tarea se complete realmente. ¡Vaya! Espero que esto ayude.

Es porque AsyncTask.get() que bloquea el subproceso de UI "Espera si es necesario para completar el cálculo y luego recupera su resultado".

La forma correcta de hacerlo es pasar la instancia de Activity a su AsyncTask por constructor y terminar lo que quiera hacer en AsyncTask.onPostExecution() .

Si subclases el AsyncTask en su Actividad actual, puede utilizar el método onPostExecute para asignar el resultado del trabajo de fondo a un miembro de su clase de llamada.

El resultado se pasa como un parámetro en este método, si se especifica como el tercer tipo genérico.

De esta manera, su hilo de interfaz de usuario no se bloqueará como se mencionó anteriormente. Debe tener cuidado de cualquier uso posterior del resultado fuera de la subclase, ya que el subproceso de fondo todavía podría estar en ejecución y su miembro no tendría el nuevo valor.

  • Cómo utilizar AsyncTask clase para actualizar el progreso de copiar un archivo de otro directorio?
  • ¿Por qué usar Retrofit con AsyncTask?
  • Enfoque eficiente para comprobar continuamente si la conexión a Internet está disponible en Android
  • OnCreateView () espera que AsyncTask se ejecute?
  • Cancelar AsyncTask cuando el usuario presiona el botón Atrás
  • Descargar un archivo con Android y mostrar el progreso en un ProgressDialog
  • Mejor práctica de Android AsyncTask
  • Android AsyncTask - Orden de ejecución
  • Propósito de los parámetros de varianza de AsyncTask
  • ¿Cómo puedo hacer conexiones de URL asíncronas en Android?
  • Clases de utilidades en Android, AsyncTask y loose-coupling por favor avise
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.