Vous devriez le faire avec l'aide de AsyncTask (un fil backround intelligent) et ProgressDialog
AsyncTask permet une utilisation correcte et facile du thread d'interface utilisateur. Cette classe permet d'effectuer des opérations d'arrière-plan et de publier des résultats sur le thread d'interface utilisateur sans avoir à manipuler des threads et/ou des gestionnaires.
Une tâche asynchrone est définie par un calcul qui s'exécute sur un thread d'arrière-plan et dont le résultat est publié sur le thread de l'interface utilisateur. Une tâche asynchrone est définie par 3 types génériques, appelés Params, Progress et Result, et 4 étapes, appelées begin, doInBackground, processProgress et end.
Les 4 étapes
Lorsqu'une tâche asynchrone est exécutée, la tâche passe par 4 étapes:
onPreExecute()
, sur le fil invoqué de l'interface utilisateur immédiatement après la tâche est exécutée. Cette étape est normalement utilisée pour configurer la tâche, par exemple en affichant une barre de progression dans l'interface utilisateur.
doInBackground(Params...)
, invoqué sur le thread d'arrière-plan immédiatement après l'exécution de onPreExecute(). Cette étape est utilisée pour effectuer un calcul en arrière-plan qui peut prendre beaucoup de temps. Les paramètres de la tâche asynchrone sont transmis à cette étape. Le résultat du calcul doit être retourné par cette étape et sera renvoyé à la dernière étape. Cette étape peut également utiliser publishProgress (Progress ...) pour publier une ou plusieurs unités de progression. Ces valeurs sont publiées sur le thread de l'interface utilisateur dans l'étape onProgressUpdate (Progress ...).
onProgressUpdate(Progress...)
, invoquée sur le thread d'interface utilisateur après un appel à publishProgress (Progress ...). Le moment de l'exécution est indéfini. Cette méthode est utilisée pour afficher toute forme de progression dans l'interface utilisateur alors que le calcul de l'arrière-plan est toujours en cours d'exécution. Par exemple, il peut être utilisé pour animer une barre de progression ou afficher des journaux dans un champ de texte.
onPostExecute(Result)
, invoquée sur le thread d'interface utilisateur après la fin du calcul de l'arrière-plan. Le résultat du calcul de l'arrière-plan est passé à cette étape en tant que paramètre. règles Threading
Il y a quelques règles de filetage qui doivent être suivies pour cette classe fonctionne correctement:
L'instance de tâche doit être créé sur le thread d'interface utilisateur. execute (Params ...) doit être appelée sur le thread d'interface utilisateur. Ne pas appeler onPreExecute(), onPostExecute (résultat), doInBackground (paramètres ...), onProgressUpdate (progression ...) manuellement. La tâche peut être exécutée qu'une seule fois (une exception sera levée si une seconde exécution est tentée.)
code Exemple
Qu'est-ce que l'adaptateur fait dans cet exemple est pas important, plus important de comprendre que vous avez besoin utiliser AsyncTask pour afficher une boîte de dialogue pour la progression.
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 devrait idéalement être utilisé pour les opérations courtes (quelques secondes au plus.) [...]" - http://developer.android.com/ reference/android/os/AsyncTask.html –