2010-05-09 14 views
35

Estoy tratando de crear un ProgressDialog para una aplicación de Android (solo una simple que muestra al usuario que algo está sucediendo, sin botones ni nada) pero no puedo hacerlo bien. He pasado por foros y tutoriales, así como el código de muestra que viene con el SDK, pero fue en vano.Android: ProgressDialog no muestra

Esto es lo que tengo:

btnSubmit.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
     (...) 
      ProgressDialog pd = new ProgressDialog(MyApp.this); 
      pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      pd.setMessage("Working..."); 
      pd.setIndeterminate(true); 
      pd.setCancelable(false); 

      // now fetch the results 
      (...long time calculations here...) 

      // remove progress dialog 
      pd.dismiss(); 

También he intentado añadir pd.show(); y en mal estado un poco con el parámetro en new ProgressDialog que resulta en nada en absoluto (excepto los errores que el parámetro elegido no funcionará), lo que significa que el ProgressDialog nunca aparecerá. La aplicación sigue ejecutándose como si nunca hubiera agregado el diálogo.

No sé si estoy creando el diálogo en el lugar correcto, lo moví un poco, pero eso tampoco me ayudó. Tal vez estoy en el contexto equivocado? El código anterior está dentro de private ViewGroup _createInputForm() en MyApp.

Cualquier sugerencia se aprecia,

Respuesta

39

tienes que llamar pd.show antes de las largas aperturas de cálculo y luego el cálculo tiene que ejecutar en un hilo separado. Tan pronto como finalice este subproceso, debe llamar a pd.dismiss() para cerrar el cuadro de diálogo prgoress.

aquí se puede ver un ejemplo:

la progressdialog se crea y se muestra y un hilo es llamado a ejecutar una pesada cálculo:

@Override 
    public void onClick(View v) { 
     pd = ProgressDialog.show(lexs, "Search", "Searching...", true, false); 
     Search search = new Search( ... ); 
     SearchThread searchThread = new SearchThread(search); 
     searchThread.start(); 
    } 

y aquí el hilo:

private class SearchThread extends Thread { 

     private Search search; 

     public SearchThread(Search search) { 
      this.search = search; 
     } 

     @Override 
     public void run() {   
      search.search(); 
      handler.sendEmptyMessage(0); 
     } 

     private Handler handler = new Handler() { 

      @Override 
      public void handleMessage(Message msg) { 
       displaySearchResults(search); 
       pd.dismiss(); 
      } 
     }; 
    } 
+0

He reconstruido mi aplicación para hacer esto :) Los tutoriales que leí sonaron como si esto fuera posible sin otro hilo, pero nunca dejas de aprender. No he terminado por completo: ahora el ProgressDialog no muestra dónde debería (¡al menos se muestra!), Sino que simplemente "parpadea" poco antes de que aparezcan los resultados, pero ahora creo que puedo hacer el resto por mi cuenta;) ¡Muchas gracias por tu ayuda! – Select0r

+2

Solo para completar esto, en caso de que alguien esté interesado: el "parpadeo" de ProgressDialog es algo que solo ocurre en el emulador, no ocurre en el dispositivo real. Parece que el emulador tarda más de un segundo antes de que la solicitud (onClick) se procese realmente y la aplicación se congele hasta que eso suceda. En el dispositivo, todo está bien. – Select0r

+2

por qué no usamos pd = new ProgressDialog (this); pd.show() ;? – Emerald214

24

Le doy una solución para ello, Pruebe esto .... Primero defina el cuadro de diálogo de progreso en la actividad antes de crear() método.

private ProgressDialog progressDialog;

Ahora, en el método oncreate puede tener el botón Cualquier, haga clic en el que cambiará Activit en cualquier acción. Simplemente configure la barra de progreso allí.

progressDialog = ProgressDialog.show(FoodDriveModule.this, "", "Loading..."); 

Ahora usa hilo para Hamndle ProgressBar para mostrar y ocultar

new Thread() 
{ 
    public void run() 
    { 

    try 
     { 
     sleep(1500); 

    // do the background process or any work that takes time to see progreaa dialog 

     } 
    catch (Exception e) 
    { 
     Log.e("tag",e.getMessage()); 
    } 
// dismiss the progressdialog 
    progressDialog.dismiss(); 
} 
}.start(); 

Eso es todo!

+0

Su mostrando progressDialog perfectamente. Pero mi contexto es un poco diferente. Quiero mostrar progressDialog cuando cambie de una aplicación a otra y quiero evitar el apagón. ¿Es posible? – YuDroid

3

Esto también es posible usando AsyncTask. Esta clase crea un hilo para ti. Debería subclasificarlo y completar el método doInBackground(...).

4

El cuadro de diálogo de progreso no se muestra porque tiene que usar un hilo separado. Las mejores prácticas en Android es usar AsyncTask (altamente recomendado). Vea también este answer.

Cuestiones relacionadas