Pregunta

Hola chicos, Tengo un problema con diálogo de progreso en la apertura de una actividad (llamado actividad 2 en el ejemplo). La actividad 2 tiene una gran cantidad de código a ejecutar en este evento OnCreate.

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

Los showApps función de actividad de lanzamiento 2.

Si ejecuto este código en mi evento de clic de botón en la actividad 1, i ver el progreso, pero ella no se mueve y afeter tengo una pantalla en negro durante 2 o 3 segundos el tiempo para android para mostrar la actividad.

Si ejecuto este código en el OnCreate de Actividad2 y si se sustituye la showApps por el código en OnCreate, Actividad1 congelo 2 segundos, no veo el diálogo de progreso, y congelar de nuevo 2 segundos en la actividad 2 antes de ver la resultado.

Una idea?

¿Fue útil?

Solución

Yo tenía el mismo problema y utilizar un AsyncTask está trabajando para mí.

Hay 3 métodos importantes para anular en AsyncTask.

  1. doInBackground : este es el lugar donde la carne de su fondo ocurrirá procesamiento.
  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, a continuación, puede llamar a los métodos marco ShowDialog, dismissDialog y removeDialog desde dentro de su AsyncActivity.

Aquí hay 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);
  }
}

Otros consejos

Que yo sepa no se puede precargar cualquier actividad con la muestra de diálogo de progreso. ¿Está probando en un dispositivo real o en el emulador?

He visto soluciones que abrieron una actividad con un ViewFlipper tener una animación de progreso en el centro, y en el siguiente punto de vista, se cargó una actividad, pero no es algo que se recomienda y difícil de poner en práctica para el trabajo como desee .

GeeXor

Yo sugeriría para evitar la realización de una gran cantidad de operaciones en la Actividad 2 de OnCreate.Writing gran cantidad de operaciones en OnCreate es una razón para la pantalla en negro entre activities.So realizar esas operaciones de forma asincrónica utilizando AsyncTask o en un hilo (o escribirlos en onStart si son inevitables).

La otra sugerencia es comenzar otra progressDialog en la actividad de 2 onCreate que se extenderá hasta que todos los datos se cargan y usuario sabrá que algo está pasando en el fondo.

Esto es lo que yo haría. crear un controlador en el subproceso de interfaz de usuario, iniciar el subproceso de procesamiento de fondo y luego mostrar la progressdialog. cuando el hilo de fondo ha terminado el trabajo de conseguirlo para colocar un ejecutable en el subproceso de interfaz de usuario a través del controlador para cerrar el diálogo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top