2011-05-28 15 views
31

que quieren mostrar un cuadro de diálogo rueca mientras que mi aplicación se carga algunos datos: diálogo de la ruedadiálogo Mostrar rueda que gira, mientras que la carga de datos en Android

Spinning wheel dialog

El hilado debe mostrar en un clic de botón. Estoy usando el código a continuación, pero ahora muestra la rueca. ¿Cual podría ser el problema?

public void CheckAccount(String username, String password) { 
    try { 

     final ProgressDialog progDailog = ProgressDialog.show(this, 
      "Progress_bar or give anything you want", 
      "Give message like ....please wait....", true); 
     new Thread() { 
      public void run() { 
       try { 
        // sleep the thread, whatever time you want. 
        sleep(1000); 
       } catch (Exception e) { 
       } 
       progDailog.dismiss(); 
      } 
     }.start(); 

     //getting data code here 
     //getting data code here 
     //getting data code here 
     //getting data code here 
     //getting data code here 

    } catch (Exception e) { 
     Log.e(LOG_TAG, e.getMessage()); 
     PopIt("CheckAccountError", e.getMessage(), "Denied"); 
    } 
} 

Respuesta

48

Así que, viendo que esta respuesta es cada vez más y más upvotes, he decidido que debo tomar sobre mí mismo para mejorar la calidad de la respuesta. Cuando miro el original, no veo una "respuesta" real a la pregunta "¿cuál es el problema en mi código?". Dejo la respuesta original intacta a continuación para preservar la vinculación, que es lo que asumo que ha causado la popularidad de las respuestas.

respuesta Actualizado

Es probable que usted está violando el 'modelo de un solo hilo'. El kit de herramientas de la interfaz de usuario de Android no es seguro para la lectura de los hilos, y solo debe manipularse desde el hilo de la interfaz de usuario 'principal'. Android tiene varios métodos útiles que puedes usar para asegurarte de que tus manipulaciones de la interfaz de usuario se realicen en el hilo de la interfaz de usuario. La mayoría de los detalles de estas llamadas a métodos se pueden encontrar en la publicación del blog Android Painless Threading (enlazada en la palabra 'uno' a continuación, y here para una referencia rápida).

Al observar su código, la infracción específica que veo es que se está creando un ProgressDialog en lo que probablemente sea el subproceso de la interfaz de usuario, que luego se descarta en el subproceso de fondo recién creado.

Sería mejor que encapsule su método de fondo en un Runnable y usando View#post(Runnable) para hacer el trabajo en segundo plano.

Recuerde, hay muchas maneras de hacer el fondo, así que eche un vistazo a lo que está disponible y use lo que le parezca adecuado para su situación.

respuesta original

Tome un look en one del manytutorials de cómo hacer asynchronouswork en Android.

nuevo, aquí hay algunas otras preguntas StackOverflow que son similares

Progress dialog problem in Android

Progress Dialog on open activity

Progress Dialog while starting new activity

Android: Progress Dialog spinner not spinning

Updating progress dialog

android: showing a progress dialog

+1

Referencias perfectas, muchas gracias @nicholas! :) – Kris

+6

encanta el uso de la referencia, +1 :) – xorinzor

32
ProgressDialog dialog = new ProgressDialog(this); // this = YourActivity 
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
dialog.setMessage("Loading. Please wait..."); 
dialog.setIndeterminate(true); 
dialog.setCanceledOnTouchOutside(false); 
dialog.show(); 
+0

Funcionó como encanto. Sin embargo, ¿cómo detenerlo una vez que se han cargado los datos? – Sykox

+0

Para ocultar la llamada de diálogo 'dialog.dismiss();' –

1

que tenían el problema de cambiar entre dos actividades, la actividad A y B. ActividadLa Actividad B tenía tareas de larga ejecución que actualizaban la IU, por lo que no era candidata para AsyncTask. Lo resolví iniciando un diálogo de progreso en la Actividad A y lanzando la Actividad B antes de terminar la primera actividad. El código se parece a:

  // wrap thread around original code for progress button 
      final ProgressDialog ringProgressDialog = ProgressDialog.show(getActivity(), "Working", "Please Wait", 
        true, false); 
      ringProgressDialog.setIndeterminate(true); 
      new Thread(new Runnable() { 
       public void run() { 
        try { 

         Intent startNewActivityOpen = new Intent(getActivity(), ActivityB.class); 
         startNewActivityOpen.setFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 
         startActivity(startNewActivityOpen); 
         GlobalVars.navigateFromScreen = true; 

         Thread.sleep(3000); 


         if (ringProgressDialog != null && ringProgressDialog.isShowing()) { 
          ringProgressDialog.dismiss(); 
         } 

         getActivity().finish(); 


        } catch (Exception e) { 

        } 

       } 

      }).start(); 
Cuestiones relacionadas