2012-02-25 6 views
7

Controllare il seguente codice di esempio. I messaggi di pane tostato sono mostrati ma il file di stato progressivo non viene mai nascosto. Perché?ProgressDialog.dismiss() non funziona

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); 
    } 


} 

Dopo cinque secondi il messaggio "OK" viene mostrato, ma il progressdialog non è respinto e, anche se ho messo pd.dismiss() proprio sotto THR pd.show() I wont respingere il progressdialog entrambi e io don So perché questo sta accadendo e mi sta facendo impazzire!

risposta

23

Non si sta utilizzando la finestra di dialogo di avanzamento a destra. Noterai che l'IDE mostra un piccolo segnale di avviso vicino alla tua linea pd.show(...).

Quello che state facendo è

  1. Creare un (, irrilevante invisibile) finestra di avanzamento utilizzando new ProgressDialog()

  2. Creare un'altra progresso dialogo con il testo desiderato utilizzando pd.Show(), senza memorizzare un riferimento ad esso.

  3. Ignora la prima finestra di dialogo. Il dialogo da (2) rimane.

Se si sostituisce il codice con:

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

dovrebbe funzionare bene.

+0

Ha funzionato! Avevi ragione riguardo all'Avvertimento e non l'ho notato. Ma non riesco a capire perché l'IDE mi dica che il metodo .show() non restituisce nulla (nulla) e dopo tutto restituisce un'istanza di un ProgressDialog? – Davidoff

+0

Sì, questo funziona. show() restituisce un'istanza di ProgressDialog ma utilizzando anche la nuova parola chiave, si ottiene la stessa istanza, spero. Usando il metodo di cui sopra, il codice di rimozione funzionava, d'altra parte, usando la nuova parola chiave, il codice non funzionava. – Khushboo

+0

Grazie per l'ottima spiegazione. – suku