2010-08-14 22 views
5

Tengo lo siguiente en mi actividad que uso para descargar las películas de un usuario en su cola de LoveFilm, pero el ProgressDialog nunca aparece.ProgressDialog no aparece

public class MyListActivity extends Activity { 
    SharedPreferences prefs; 
    ProgressDialog m_progressDialog; 
    Thread listThread; 
    User user; 

    private Runnable threadProc_initializeQueue = new Runnable() { 
     public void run() { 
      user.fetchQueues(); 
      Queue defaultQueue = user.getDefaultQueue(); 
      defaultQueue.fetchTitles(); 

      m_progressDialog.dismiss(); 
     } 
    }; 

    /* (non-Javadoc) 
    * @see android.app.Activity#onCreate(android.os.Bundle) 
    */ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     prefs = getSharedPreferences(getString(R.string.app_name), MODE_PRIVATE); 

     // Authenticate the user if needs be. 
     if(!prefs.getBoolean("isAuthenticated", false)) { 
      Intent i = new Intent(this, OAuthActivity.class); 
      startActivity(i); 
      finish(); 
     } else { 
      // Get the users default list. 
      LoveDroid app = (LoveDroid) getApplication(); 
      user = new User(app); 

      m_progressDialog = ProgressDialog.show(MyListActivity.this, "Please Wait", "Loading", true); 
      listThread = new Thread(null, threadProc_initializeQueue); 
      listThread.run(); 
     } 

    } 

he visto otros con este problema, y ​​todos ellos básicamente moverse a recomendar una línea que se parece a la mía

m_progressDialog = ProgressDialog.show(MyListActivity.this, "Please Wait", "Loading", true); 

El resto del código funciona, las películas se descargan a través de los usuarios el hilo, pero el diálogo nunca aparece, también lleva unos segundos, no es como si el diálogo se descartara antes de que haya tenido tiempo de aparecer.

Respuesta

7

Es mejor si se utiliza AsyncTask (en lugar de hilo - por lo general es una buena práctica en las actividades de Android).

Cree una clase AsyncTask, y en esa clase agregue un cuadro de diálogo de progreso en onPreExecute y deséchelo en onPostExecute. Puede encontrar un ejemplo here.

Aparte de eso, hay algunos problemas en su código:

  1. Calling ProgressDialog.show (...) en onCreate (...) es generalmente problemática (ya que no lo verá hasta que onCreate termine, que por lo general es mucho después de que la actividad de fondo haya terminado).
  2. Todas las operaciones en su diálogo de progreso deben ejecutarse solo en el hilo de UI, por lo que no puede usar m_pd.dismiss() en algún hilo aleatorio (es por eso que debe usar AsyncTask).
+0

Tendré que verificar la clase AsyncTask - Nunca la he usado antes y me parece muy útil. Con los diálogos de progreso, la llamada a dismiss() puede ser llamada desde cualquier hilo, aunque se requiere que el resto de los métodos sean llamados desde el hilo de la interfaz de usuario. –

+0

Estuviste en Amitlicht, reemplacé el subproceso con un AsyncTask y todo funciona como debería, muchas gracias. –

+0

pero luego el objeto de diálogo es local al método preExecute? –

1

¿Qué sucede si llama con this en lugar de MyListActivity.this?

Es posible, aunque poco probable, ya que se encuentra en onCreate(), que no se está llamando desde el subproceso de la interfaz de usuario.

Probar que rodea la llamada con runOnUiThread():

Activity me = this; 
    runOnUiThread(new Runnable() 
    { 
     public void run() 
     { 
      m_progressDialog = ProgressDialog.show(me, "Please Wait", "Loading", true); 
     } 
    });