Pregunta

estoy usando un AsyncTask subclase para algún procesamiento en segundo plano.El problema es que cuando uso la clase con el .get() método, el ProgressDialog especifico en el onPreExecute() no muestra.

Funciona bien si uso una devolución de llamada dentro del onPostExecute() método.

Mi primer pensamiento fue que esto se debía a que el .get() espera a que se complete el proceso, pero eso tampoco puede bloquear el hilo de la interfaz de usuario, por lo que ese no es el caso.

¿Alguien puede explicar por qué este comportamiento es así y si existe una solución para esto?Realmente me gustaría usar el .get() método si puedo.

¿Fue útil?

Solución

Inicialmente acepté la otra respuesta pero parece estar incorrecta.

El .get() El método bloqueará el hilo de la interfaz de usuario para esperar el resultado y cualquier cuadro de diálogo mostrado también se bloqueará.Este es el comportamiento esperado para este método.

La única alternativa es no utilizar .get() si la actividad en segundo plano dura un período de tiempo considerable y, en su lugar, utilice métodos de devolución de llamada para la actividad de llamada.

Otros consejos

Vocación AysncTask.get() en el hilo de la interfaz de usuario bloqueará la ejecución del hilo de la interfaz de usuario y hará que el hilo de la interfaz de usuario espere a que finalice AysncTask.doInBackground().Al hacer esto, en realidad está sacrificando el beneficio de AsycnTask, todo el código ahora se ejecuta sincrónicamente en el subproceso de la interfaz de usuario y en el subproceso de fondo (todavía hay dos subprocesos, pero el subproceso de la interfaz de usuario ahora espera el subproceso de fondo).

También tenga en cuenta que probablemente obtendrá una excepción ANR (bloqueada durante más de 5 segundos) al llamar a get() en el hilo de la interfaz de usuario.

Si realmente tienes que usarlo, llama a tu método showDialog() antes de myAsyncTask.get():

showDialog();
myAsyncTask.execute();
myAsyncTask.get(); // <-- UI thread blocked and wait at this point.
dismissDialog();// <-- This line will be executed after doInBackground() finish.

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top