ProgressDialog no hace caso del dismiss()

435 views
Skip to first unread message

luiX_

unread,
Mar 13, 2011, 3:23:36 PM3/13/11
to Desarrolladores android googlegroup, android...@googlegroups.com
Buenas,

Tengo un problemilla con un ProgressDialog que no consigo solucionar, así que a ver si alguno sabe por donde pueden ir los tiros...

Tengo un método sync() que muestra el ProgressDialog y luego arranca otro hilo implementado en una inner class que lo que hace es llamar a otros métodos que sincronizarn unos datos, código:

    private void sync() {
    progressDialog = new ProgressDialog(this);
    progressDialog.show(Administration.this, "Espere", "Importando datos desde ficheros...", true);
    // creating a thread to import data:
    new Thread() {
    public void run() {
    boolean result = true;
    result &= syncProducts();
    result &= syncUsers();
    result &= syncPayModes();
    result &= syncClients();
    progressDialog.dismiss();
    if (result) {
    handler.sendEmptyMessage(1);
    } else {
    handler.sendEmptyMessage(0);
    }
    }
    }.start();
    }

También tengo un método que implementa el Handler para actuar en consecuencia del mensaje enviado por el hilo al finalizar, que lo que hace es mostrar un AlertDialog indicando si todo ha ido bien o no, el código:

    private Handler handler = new Handler() {
   
public void handleMessage(Message msg) {
if (msg.what == 1) {
infoDialog("Los datos se han importado correctamente", "Correcto!", R.drawable.ok);
} else {
infoDialog("Error importando los datos!", "Error!", R.drawable.error);
}
}
    };


Como véis, al terminar el hilo, se llama al dismiss() del progress dialog, lo que debería hacer que desapareciera. Pues bien, el AlertDialog aparece indicando que todo ha ido bien, pero después el ProgressDialog sigue ahí.

He probado a hacer el dismiss() en el handler pero tampoco funciona, ¿alguna idea?

Gracias!

jlmo...@gmail.com

unread,
Mar 13, 2011, 4:11:47 PM3/13/11
to spanis...@googlegroups.com, luiX_, Desarrolladores android googlegroup, android...@googlegroups.com
No se cual es el problema que tienes... pero yo lo que hago cuando hago ese tipo de tareas es lanzar una asyncTask y en el preExecute lanzar el progressdialog y en el postExecute hacer el dismiss.

prueba a hacerlo asi a ver que tal... y nos cuentas...

2011/3/13 luiX_ <lui...@gmail.com>

Damasia Maneiro

unread,
Mar 14, 2011, 9:09:15 AM3/14/11
to android...@googlegroups.com
Hola!, por lo que veo, el progressDialog.dismiss(); debería estar luego del envío del mensaje al handler. Asi cuando termina este proceso, cierra el progressDialog.

luiX_

unread,
Mar 14, 2011, 9:25:20 AM3/14/11
to android...@googlegroups.com
¿Y no debería poder cerrar el dialog cuando quisiera?

Es decir, no entiendo porqué se ejecuta el dismiss() (visto en el debugger, la llamada al dismiss se hace), pero no afecta al dialog.

Héctor

unread,
Mar 14, 2011, 9:51:10 AM3/14/11
to AndroidStartup
Sí, en la documentación pone que se puede llamar desde cualquier
sitio. Lo único que se me ocurre es que se esté llamando al método
sync() dos veces y estés haciendo el dismiss sobre la referencia
equivocada... o algo así... A mí, por lo menos, el código me parece
correcto :S


On Mar 14, 2:25 pm, luiX_ <lui...@gmail.com> wrote:
> ¿Y no debería poder cerrar el dialog cuando quisiera?
>
> Es decir, no entiendo porqué se ejecuta el dismiss() (visto en el debugger,
> la llamada al dismiss se hace), pero no afecta al dialog.
>
> El 14 de marzo de 2011 14:09, Damasia Maneiro
> <damasia.mane...@gmail.com>escribió:
>
>
>
>
>
>
>
> > Hola!, por lo que veo, el *progressDialog.dismiss();* debería estar luego
> > del envío del mensaje al handler. Asi cuando termina este proceso, cierra el
> > progressDialog.
>
> > Saludos
>
> > 2011/3/13 jlmont...@gmail.com <jlmont...@gmail.com>
>
> > No se cual es el problema que tienes... pero yo lo que hago cuando hago ese
> >> tipo de tareas es lanzar una asyncTask y en el preExecute lanzar el
> >> progressdialog y en el postExecute hacer el dismiss.
>
> >> prueba a hacerlo asi a ver que tal... y nos cuentas...
>
> >> 2011/3/13 luiX_ <lui...@gmail.com>
>
> >>> Buenas,
>
> >>> Tengo un problemilla con un ProgressDialog que no consigo solucionar, así
> >>> que a ver si alguno sabe por donde pueden ir los tiros...
>
> >>> Tengo un método sync() que muestra el ProgressDialog y luego arranca otro
> >>> hilo implementado en una *inner class* que lo que hace es llamar a otros
> >>> métodos que sincronizarn unos datos, código:
>
> >>>     private void sync() {
> >>>     progressDialog = new ProgressDialog(this);
> >>>     progressDialog.show(Administration.this, "Espere", "Importando datos
> >>> desde ficheros...", true);
> >>>     // creating a thread to import data:
> >>>     new Thread() {
> >>>     public void run() {
> >>>     boolean result = true;
> >>>     result &= syncProducts();
> >>>     result &= syncUsers();
> >>>     result &= syncPayModes();
> >>>     result &= syncClients();
> >>>     *progressDialog.dismiss();*
> >>>     if (result) {
> >>>     handler.sendEmptyMessage(1);
> >>>     } else {
> >>>     handler.sendEmptyMessage(0);
> >>>     }
> >>>     }
> >>>     }*.start()*;

Raúl Martín

unread,
Mar 14, 2011, 10:29:49 AM3/14/11
to android...@googlegroups.com, Héctor
A mi me paso exactamente lo mismo y el tema es que como te dicen el
dissmis no puede estar en el run o al menos yo no fui capaz de hacer
que funcionara. por otro lado me parece más elegante sacarlo.

Yo lo hago en el handler comprobando que ha acabado (no es necesarios
si solo usas el handler para eso pero no esta demás hacerlo bien). Y
comprobando el metodo isShowing

Algo así


private class GetURLThread extends Thread {

private URL url;

Handler mHandler = new Handler() {
public void handleMessage(Message msg) {

int total = msg.getData().getInt("total"); //lo
creamos para pasarle el porcentaje de proceso aunque solo le pasamos
el 100%

if (total >= 100){
if(dialog.isShowing())
dialog.dismiss();
}
}
};

....
public void run() {

//Aquí haces todo tu código...

Message msg = mHandler.obtainMessage();
Bundle b = new Bundle();
b.putInt("total", 100);
msg.setData(b);
mHandler.sendMessage(msg);

//dialog.dismiss(); // NO RULABA
return;


}


Un saludo y espero que te sirva


El día 14 de marzo de 2011 14:51, Héctor
<hectorlope...@gmail.com> escribió:

luiX_

unread,
Mar 14, 2011, 10:48:32 AM3/14/11
to android...@googlegroups.com

Fué la primeea variante que probé, hacerlo en el Handler que, como bien dices, es donde debería hacerse y tampoco me funcionó, pero luego me ha surgido una duda sobre si estaba pillando bien la referencia del show, asi que al llegar a casa compararé con las versiones anteriores por si acaso...

Gracias a todos! :)

Reply all
Reply to author
Forward
0 new messages