2011-02-01 19 views
20

Tengo un ListActivity que inicia otro Activity según la selección de la lista. Este segundo Activity necesita cargar un poco de datos de Internet y, como tal, hay un retraso notable entre cuando el usuario hace clic en un elemento y cuando aparece el Activity.Mostrar una barra de progreso cuando se carga una actividad

Esto es un problema porque actualmente no tengo manera de indicarle al usuario que se está procesando su clic (incluso bastaría con cambiar el color del elemento de la lista seleccionada, pero no puedo encontrar una buena manera de hacerlo ese). Idealmente, podría mostrar un ProgressDialog indeterminado mientras se carga el segundo Activity.

He intentado algunos enfoques diferentes para esto, pero nada parece funcionar como se desee.


He intentado lo siguiente:

  • Recuperando los datos serializables (no todos, pero alguna parte) en un AsyncTask en el primer Activity y haciéndola pasar como un extra a la segunda. Esto en realidad no funciona así como un ProgressDialog que creé en onPreExecute() no mostrar inmediatamente (parece retrasa por la transformación efectuada en doInBackground() por alguna razón.)

Este es el código para eso:

AsyncTask<String, Void, String> read = new AsyncTask<String, Void, String>() { 
    Dialog progress; 

    @Override 
    protected void onPreExecute() { 
     progress = ProgressDialog.show(SearchActivity.this, 
       "Loading data", "Please wait..."); 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     DatasetReader reader = new DatasetReader(); 
     reader.setFundID(params[0]); 
     reader.addDatsets(FundProfile.datasets); 
     reader.populate(); 
     return reader.toString(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     progress.dismiss(); 
    } 
}; 
read.execute(selectedItem.getUniqueID()); 
try { 
    action = new Intent(SearchActivity.this, FundProfile.class); 
    action.putExtra("data", read.get()); 
} catch(Exception ex) { 
    ex.printStackTrace(); 
} 
  • en el método de la segunda actividad onCreate() (esto no funciona en absoluto):

    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    setProgressBarVisibility(true);

Aquí es el método onCreate() para el segundo enfoque:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.setTitleColor(Color.WHITE); 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    setProgressBarVisibility(true); 

    try { 
     setContentView(R.layout.fund_profile); 
     // init some data 
     setProgressBarVisibility(false); 
    } catch(Exception ex) { 
     FundProfile.this.finish(); 
    } 
} 
+1

¿Qué enfoques diferentes ha probado? ¿Podría compartir sus intentos? – Cristian

+0

Me sorprende que el primer enfoque no haya funcionado. Un 'ProgressDialog' que se muestra en' onPreExecute() 'no debe ser retenido por el código en' doInBackground() ', ¿tal vez hubo algún otro problema con su código? –

+0

¿Posiblemente? Agregué el código correspondiente ... – Adam

Respuesta

16

Si tiene operaciones largas, no debería hacerlas en Crear en cualquier caso, ya que esto congelaría la IU (independientemente de que se muestre o no la actividad). La interfaz de usuario establecida por onCreate no aparecerá y la UI no responderá hasta que finalice la llamada onCreate.

Parece que puede iniciar su segunda actividad y mostrar una barra de progreso (o requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);), luego inicie una ASyncTask que será responsable de actualizar su UI una vez que se hayan recuperado los datos.

+0

Sí, pensé que esa es la manera correcta de hacerlo (cargar datos en otro hilo), pero quería evitarlo por ahora ... pero mordí la bala y lo hice de esta manera (AsyncTask lo hace menos doloroso de lo que podría haber sido ...) – Adam

2

Adam,

Suena como que busca la barra indeterminada Progreso: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ProgressBar2.html

Puede mostrar esto mientras está cargando su segundo Activity y luego establece la visibilidad en falso una vez que el segundo Activity haya cargado sus datos.

+0

Lo he intentado, pero parece que no funciona para mí. – Adam

+0

¿No lo estás viendo en absoluto? ¿Qué exactamente no está funcionando? –

+0

La vista de la primera actividad permanece en la pantalla hasta que todo el método onCreate() finaliza, por lo que nunca veo una barra de progreso. – Adam

3

Mover la creación de la Intención - y realmente todo lo que hay que hacer después de la AsyncTask completa - en onPostExecute:

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    progress.dismiss(); 
    Intent action = new Intent(SearchActivity.this, FundProfile.class); 
    action.putExtra("data", result); 
    // ... do more here 
} 

El problema es que AsyncTask.get() blocks hasta que se complete la tarea.Por lo tanto, en el código anterior, el subproceso de interfaz de usuario está bloqueado y ProgressDialog nunca tiene la oportunidad de aparecer hasta que la tarea finalice.

+0

Ah, eso explica por qué eso no funcionó ... – Adam

Cuestiones relacionadas