2010-11-23 11 views
7

Hola chicos, tengo un problema con el diálogo de progreso al abrir una actividad (llamada actividad 2 en el ejemplo). La actividad 2 tiene mucho código para ejecutar en este evento OnCreate.Diálogo de progreso en la actividad abierta

final ProgressDialog myProgressDialog = ProgressDialog.show(MyApp.this,getString(R.string.lstAppWait), getString(R.string.lstAppLoading), true); 
new Thread() { 
    public void run() { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       showApps(); 
      } 
     }); 
     myProgressDialog.dismiss(); 
    } 
}.start(); 

La función de lanzamiento showApps actividad 2.

si ejecuta este código en mi evento de clic de botón en la actividad 1, veo el progreso, pero ella no se mueve y afeter tengo una pantalla en negro durante 2 o 3 segundos, el tiempo para que Android muestre la actividad.

Si ejecuto este código en OnCreate of Activity2 y si reemplazo el showApps por el código en OnCreate, Activity1 se congela 2 segundos, no veo el diálogo de progreso y vuelvo a congelar 2 segundos en la actividad 2 antes de ver el resultado.

¿Una idea?

+0

Se crea un hilo que se ejecutará el código que se ejecuta en el hilo de interfaz de usuario ?! ¿Es esto un truco/solución que necesito saber o es esto simplemente incorrecto? – WarrenFaith

+0

Hola @WarrenFaith, ¿podrías darme un puntapié y aceptar mi respuesta mejor votada a esta pregunta? –

+0

@Darren no es mi pregunta :) – WarrenFaith

Respuesta

10

Tuve el mismo problema y el uso de AsyncTask me funciona.

Hay 3 métodos importantes para sobrescribir en AsyncTask.

  1. doInBackground: aquí es donde se produce la carne de su procesamiento en segundo plano .
  2. OnPreExecute: mostrar su ProgressDialog aquí (showDialog)
  3. onPostExecute: ocultar su ProgressDialog aquí (removeDialog o dismissDialog )

Si usted hace su subclase AsyncTask como una clase interna de su actividad , entonces puede llamar a los métodos de framework showDialog, dismissDialog, y removeDialog desde su AsyncActivity.

He aquí un ejemplo de implementación de AsyncTask:

class LoginProgressTask extends AsyncTask<String, Integer, Boolean> { 
    @Override 
    protected Boolean doInBackground(String... params) { 
    try { 
     Thread.sleep(4000); // Do your real work here 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    return Boolean.TRUE; // Return your real result here 
    } 
    @Override 
    protected void onPreExecute() { 
    showDialog(AUTHORIZING_DIALOG); 
    } 
    @Override 
    protected void onPostExecute(Boolean result) { 
    // result is the value returned from doInBackground 
    removeDialog(AUTHORIZING_DIALOG); 
    Intent i = new Intent(HelloAndroid.this, LandingActivity.class); 
    startActivity(i); 
    } 
} 
2

AFAIK no puede precargar ninguna actividad con el cuadro de diálogo de progreso mostrado. ¿Estás probando en un dispositivo real o en un emulador?

He visto soluciones que abrían una actividad con un ViewFlipper que tenía una animación de progreso en el centro, y en la siguiente Vista, se cargaba una actividad, pero no es algo recomendado y difícil de implementar para trabajar como usted deseo.

+0

Sí, he probado ambos con el mismo resultado, más rápido con el emulador porque lanzo una actividad con todas las aplicaciones instaladas, y pocas con el emulador. Hum, 2 animaciones no es el comentario que deseo:/ – Pachanka

3

GeeXor

Yo te sugeriría a evitar la realización de una gran cantidad de operaciones en la actividad de 2 lotes OnCreate.Writing de operaciones en OnCreate es una razón para la pantalla en negro entre activities.So realizar estas operaciones de forma asincrónica utilizando AsyncTask o en una Enhebrar (o escríbalos en onStart si son inevitables).

La otra sugerencia es iniciar otro progressDialog en la actividad 2 en onCreate que se ejecutará hasta que se carguen todos sus datos & el usuario sabrá que algo está sucediendo en el fondo.

+0

bien, voy a buscar esta noche y encontrar la respuesta, gracias – Pachanka

0

esto es lo que haría. crea un controlador en el subproceso ui, inicia el subproceso de procesamiento en segundo plano y luego muestra el progreso del diálogo. cuando el hilo de fondo haya terminado, consiga que se publique un elemento ejecutable en el hilo de la interfaz de usuario a través del controlador para cerrar el diálogo.

+0

hum he visto muchas aplicaciones con una pequeña rueda como diálogo de progreso directamente en la actividad (arriba o abajo en la actividad). Que es eso ? – Pachanka

+0

Eche un vistazo a 'Activity.setProgress'. Hay una serie de opciones para configurar la pequeña rueca en la barra de título de la actividad. – techiServices

+0

bien, he encontrado una solución aquí: http://stackoverflow.com/questions/3893626/how-to-use-asynctask-to-show-a-progressdialog-while-doing-background-work-in-andr – Pachanka

Cuestiones relacionadas