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
- Cuando se llama a un archivo php con algún código js de android, el código js es la salida de una llamada
- NetworkOnMainThreadException
- ¿Cómo manejar sin conexión a Internet y pérdida en Android?
- Descargar archivo como Android Market
- La interfaz de usuario principal se congela incluso cuando las tareas son manejadas por AsyncTask
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?
- Uso de AsyncTask para cargar imágenes en un adaptador personalizado
- ¿Por qué esta tarea de fondo falla con una excepción fatal?
- Entidad devuelve error en MultiPartEntityBuilder
- Evitar que el asynctask se ejecute varias veces
- Cómo llamar a un asynctask dentro de un evento de clic de botón
- ¿Cómo puedo reutilizar una clase interna en Java / Android?
- Java.lang.RuntimeException con Facebook Login ejemplo
- ¿Cómo puedo pasar una Lista <Map <String, String >> utilizando putExtra a otra intención
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