2012-02-25 6 views
7

Compruebe el siguiente código de ejemplo. Los mensajes de pan tostado se muestran pero el diálogo de progreso nunca se oculta. ¿Por qué?ProgressDialog.dismiss() no funciona

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.widget.Toast; 


public class LoadExamActivity extends Activity implements Runnable{ 
    ProgressDialog pd; 

    Handler Finished = new Handler(){ 
     @Override 
     public void handleMessage(Message msg){ 
      Toast.makeText(getApplicationContext(), "DONE!", Toast.LENGTH_SHORT).show(); 
      pd.dismiss(); 
     } 
    }; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.exam); 
     Toast.makeText(this, "START!", Toast.LENGTH_SHORT).show(); 
     pd = new ProgressDialog(this); 
     pd.show(this, "Waiting...", "Please wait five seconds..."); 
     Thread th = new Thread(this); 
     th.start(); 


    } 

    public void run() { 
     //To change body of implemented methods use File | Settings | File Templates. 
     for (int i = 0; i < 5; i++) 
     { 
      try 
      { 
       Thread.sleep(1000); 
      }catch(Exception e){} 
     } 
     Finished.sendEmptyMessage(0); 
    } 


} 

Después de cinco segundos el mensaje "DONE" se muestra pero el progressdialog no es despedido e incluso si pongo pd.dismiss() justo debajo del thr pd.show() no voy a descartar la progressdialog tampoco y don ¡No sé por qué sucede esto y me está volviendo loco!

Respuesta

23

No está utilizando el cuadro de diálogo de progreso. Notarás que el IDE muestra un pequeño y cuidado letrero de advertencia al lado de tu línea pd.show(...).

Lo que está haciendo es

  1. Crear (irrelevante invisible) de diálogo de progreso usando new ProgressDialog()

  2. Crear otra progreso de diálogo con el texto deseado utilizando pd.Show(), sin almacenar una referencia a eso

  3. Descartar el primer cuadro de diálogo. El diálogo de (2) permanece.

Si reemplaza el código con:

//pd = new ProgressDialog(this); 
pd = ProgressDialog.show(this, "Waiting...", "Please wait five seconds..."); 

Debería funcionar bien.

+0

¡FUNCIONÓ! Tenías razón sobre la Advertencia y no me di cuenta. Pero no puedo entender por qué el IDE me dice que el método .show() no devuelve nada (nulo) y, después de todo, devuelve una instancia de un ProgressDialog. – Davidoff

+0

Sí, esto funciona. show() devuelve una instancia de ProgressDialog, pero con la nueva palabra clave también, obtenemos la misma instancia, espero. Usando el camino anterior, el código de descarte funcionó, por otro lado, usando la nueva palabra clave, el código no estaba funcionando. – Khushboo

+0

Gracias por la gran explicación. – suku