studio que onpostexecute new hilos examples asynctask android android-asynctask progressdialog

android - que - ProgressDialog no se muestra cuando AsyncTask.get() se llama



hilos asynctask android (4)

Posible duplicado:
AsyncTask bloquea la amenaza de la interfaz de usuario y muestra la barra de progreso con retraso

Quiero mostrar un diálogo de progreso mientras recupero JSON de cualquier servidor. Así que había usado AsyncTask como una solución (no estoy seguro de una salida diferente).

Todo está bien, el ProgressDialog funciona correctamente hasta que llame al método .get () utilizando la instancia de AsyncTask. Supongo que está bloqueando la interfaz de usuario de alguna manera. Aquí está mi AsyncTask:

public class myAsync extends AsyncTask<String, String, List> { String message; // for dialog message ProgressDialog progress; Intent myIntent; Context ctx; public myAsync(String message, Context ctx) { this.message = message; this.ctx = ctx; progress = new ProgressDialog(ctx); } @Override protected void onPreExecute() { progress.setMessage(message); progress.setIndeterminate(true); progress.setCancelable(false); progress.show(); } @Override protected List doInBackground(String... params) { //returns any list after the task return anyList; } @Override protected void onPostExecute(List result) { if(progress.isShowing()) progress.dismiss(); } }

Y aquí está myActivity, que se llama AsyncTask:

myAsync asyncTask = new myAsync("Loading...", this); asyncTask.execute("Any string", "Other string"); asyncTask.get(); // If I comment out this line, ProgressDialog works

Después de ejecutar, cuando intenté registrar el resultado de doInBackground y onPostExecute, no hay problema. Pero si quiero obtener con .get () el resultado, ProgressDialog no se muestra o se muestra tan poco tiempo (tal vez 0.2 segundos)

¿Cuál es el problema?


Al llamar a .get() , tu AsyncTask en una " SyncTask " efectiva, ya que hace que el subproceso actual (que sería el subproceso de la interfaz de usuario) espere hasta que AsyncTask haya finalizado su procesamiento. Como ahora está bloqueando el subproceso de la interfaz de usuario, la llamada al método .show() ProgressDialog nunca tendrá la oportunidad de permitir que el diálogo se dibuje en la pantalla.

La eliminación de la llamada permitirá que se ejecute correctamente en segundo plano.

Si necesita realizar el procesamiento después de que la tarea haya finalizado, le sugiero que lo coloque dentro del onPostExecute método onPostExecute o que utilice una devolución de llamada a la Activity desde onPostExecute .


Intenta usar runOnUiThread como este:

runOnUiThread(new Runnable(){ public void run() { dialog.show(); }});

Ejecutar algo en una AsyncTask significa que se está alejando de UIthread, por lo que normalmente no se pueden ejecutar operaciones de interfaz de usuario dentro de los métodos Async sin controladores y cosas de las que normalmente me mantengo alejado. También manejo esta solución creando un progressDialog como una variable en mi clase sobre mi oncreate para que sea visible para toda la clase. Luego llamo a la barra de diálogo de progreso justo antes de mi asynctask y luego, ya que es visible para toda la clase a la que llamo .dissmiss () en onPostExecute


Sí, get() espera si es necesario para que se complete el cálculo, y luego recupera el resultado. Esto significa que estás bloqueando tu hilo de UI, esperando el resultado.

Solución: No llame a get

Por lo general, llamará a una función (devolución de llamada) en postExecute .


Si entiendo su pregunta correctamente, necesita actualizar el progreso de su AsyncTask en un ProgressDialog y esto no está funcionando actualmente. Un par de cosas a tener en cuenta: no estoy seguro de lo que intentas lograr con .get() pero supongo que quieres mostrar el progreso.

He modificado su programa a continuación para actualizar el hilo de la IU con el progreso de su AsyncTask. Cada vez que necesite actualizar el progreso, actualice la variable prog en el método doInBackground .

public class myAsync extends AsyncTask<String, Integer, List> { String message; // for dialog message ProgressDialog progress; Intent myIntent; Context ctx; public myAsync(String message, Context ctx) { this.message = message; this.ctx = ctx; progress = new ProgressDialog(ctx); } @Override protected void onPreExecute() { // Runs on the UI thread progress.setMessage(message); progress.setIndeterminate(true); progress.setCancelable(false); progress.show(); } @Override protected List doInBackground(String... params) { // Runs in the background thread // publish your progress here!! int prog = 5; // This number will represent your "progress" publishProgress(prog); return anyList; } protected void onProgressUpdate(Integer... progress) { // Runs in the UI thread // This method will fire (on the UI thread) EVERYTIME publishProgress // is called. Log.d(TAG, "Progress is: " +progress); } @Override protected void onPostExecute(List result) { // Runs in the UI thread for (int i=0; i<result.size(); i++) { Log.d(TAG, "List item: " + result.get(i)); } if(progress.isShowing()) progress.dismiss(); } }