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
- Android: AsyncTask ProgressDialog no se abrirá en ActivityGroup
- Async / espera no reaccionar como se esperaba
- ¿Se está destruyendo la actividad porque la orientación ha cambiado o porque la aplicación se está cerrando?
- Android: Mejor manera de obtener datos del servidor (Widget + aplicación)
- Cómo pasar en dos tipos de datos diferentes a AsyncTask, Android
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?
- AsyncTask y Contextos
- Llamar a varias AsyncTask a la vez que no funcionan en Android
- Cómo manejar las gotas de conexión a Internet?
- Cómo lanzar una excepción si se ejecuta un método desde el subproceso principal
- Android AsyncTask como argumento del método
- Android - ¿Configurar un tiempo de espera para un AsyncTask?
- Clase común para AsyncTask en Android?
- Conseguir un no puede hacer una redfrence estática a una no estática methed cuando llamo AsyncTask <Void.exicute
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 guardar una cookie en una vista web de Android para siempre?
- Externalizar cadenas para el proyecto de Android