Usted debe hacer esto con la ayuda de AsyncTask (un hilo apaisada inteligente) y ProgressDialog
AsyncTask permite el uso adecuado y fácil del hilo de interfaz de usuario. Esta clase permite realizar operaciones en segundo plano y publicar resultados en el subproceso de la interfaz de usuario sin tener que manipular subprocesos y/o controladores.
Una tarea asincrónica se define mediante un cálculo que se ejecuta en un subproceso en segundo plano y cuyo resultado se publica en el subproceso de la interfaz de usuario. Una tarea asincrónica está definida por 3 tipos genéricos, llamados Params, Progress y Result, y 4 pasos, llamados begin, doInBackground, processProgress y end.
los 4 pasos
Cuando se ejecuta una tarea asíncrona, la tarea pasa a través de 4 pasos:
onPreExecute()
, invocados en el subproceso de interfaz de usuario inmediatamente después de que se ejecute la tarea. Este paso se usa normalmente para configurar la tarea, por ejemplo, al mostrar una barra de progreso en la interfaz de usuario.
doInBackground(Params...)
, invocado en el subproceso de fondo inmediatamente después de que onPreExecute() termine de ejecutarse. Este paso se usa para realizar un cálculo de fondo que puede llevar mucho tiempo. Los parámetros de la tarea asíncrona se pasan a este paso. El resultado del cálculo debe ser devuelto por este paso y será devuelto al último paso. Este paso también puede usar publishProgress (Progress ...) para publicar una o más unidades de progreso. Estos valores se publican en el subproceso UI, en el paso onProgressUpdate (Progreso ...).
onProgressUpdate(Progress...)
, invocado en el hilo de la IU después de una llamada a publishProgress (Progreso ...). El momento de la ejecución no está definido. Este método se usa para mostrar cualquier forma de progreso en la interfaz de usuario mientras el cálculo de fondo aún se está ejecutando. Por ejemplo, se puede usar para animar una barra de progreso o mostrar registros en un campo de texto.
onPostExecute(Result)
, invocado en el hilo de la interfaz de usuario una vez que finaliza el cálculo de fondo. El resultado del cálculo de fondo se pasa a este paso como un parámetro. reglas de roscado
Hay algunas reglas de roscado que se deben seguir para esta clase funcione correctamente:
La instancia de tarea se debe crear en el hilo de interfaz de usuario. execute (Params ...) debe invocarse en el subproceso de UI. No invoque onPreExecute(), onPostExecute (Result), doInBackground (Params ...), onProgressUpdate (Progress ...) manualmente. La tarea se puede ejecutar sólo una vez (una excepción se produce si se intenta una segunda ejecución.)
código Ejemplo
Lo que hace el adaptador en este ejemplo no es lo importante, más importante entender que usted necesita para usar AsyncTask para mostrar un diálogo para el progreso.
private class PrepareAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > {
ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(viewContacts.this);
dialog.setMessage(getString(R.string.please_wait_while_loading));
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
/* (non-Javadoc)
* @see android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected ContactsListCursorAdapter doInBackground(Void... params) {
cur1 = objItem.getContacts();
startManagingCursor(cur1);
adapter1 = new ContactsListCursorAdapter (viewContacts.this,
R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {});
return adapter1;
}
protected void onPostExecute(ContactsListCursorAdapter result) {
list.setAdapter(result);
dialog.dismiss();
}
}
"AsyncTasks idealmente debería ser usado para operaciones de corto (unos pocos segundos en la mayoría.) [...]" - http://developer.android.com/ reference/android/os/AsyncTask.html –