Sie dies mit Hilfe von AsyncTask (ein intelligenter Hintergrund-Thread) und ProgressDialog
AsyncTask Verwendung des UI-Thread ermöglicht korrekte und einfach tun sollten. Mit dieser Klasse können Hintergrundoperationen ausgeführt und Ergebnisse im UI-Thread veröffentlicht werden, ohne dass Threads und/oder Handler manipuliert werden müssen.
Eine asynchrone Aufgabe wird durch eine Berechnung festgelegt, die auf einem Hintergrund-Thread ausgeführt wird, und dessen Ergebnis wird auf dem UI-Thema veröffentlicht. Eine asynchrone Task wird durch 3 generische Typen definiert, genannt Params, Progress und Result, und 4 Schritte, genannt begin, doInBackground, processProgress und end.
Die 4 Schritte
Wenn eine asynchrone Aufgabe ausgeführt wird, geht die Aufgabe, über 4 Stufen:
onPreExecute()
, auf dem UI-Thread aufgerufen wird, unmittelbar nachdem die Aufgabe ausgeführt wird. Dieser Schritt wird normalerweise zum Einrichten der Aufgabe verwendet, z. B. durch Anzeigen einer Fortschrittsleiste in der Benutzeroberfläche.
doInBackground(Params...)
, auf dem Hintergrund-Thread aufgerufen unmittelbar nach OnPreExecute() beendet die Ausführung. Dieser Schritt wird verwendet, um eine Hintergrundberechnung durchzuführen, die sehr lange dauern kann. Die Parameter der asynchronen Task werden an diesen Schritt übergeben. Das Ergebnis der Berechnung muss von diesem Schritt zurückgegeben werden und wird an den letzten Schritt zurückgegeben. Dieser Schritt kann auch publishProgress (Progress ...) verwenden, um eine oder mehrere Fortschrittseinheiten zu veröffentlichen. Diese Werte werden im Schritt onProgressUpdate (Progress ...) im UI-Thread veröffentlicht.
onProgressUpdate(Progress...)
, aufgerufen, auf dem UI-Thread nach einem Aufruf publishProgress (Progress ...). Der Zeitpunkt der Ausführung ist nicht definiert. Diese Methode wird verwendet, um jede Art von Fortschritt in der Benutzerschnittstelle anzuzeigen, während die Hintergrundberechnung noch ausgeführt wird. Zum Beispiel kann damit eine Fortschrittsleiste animiert oder Protokolle in einem Textfeld angezeigt werden.
onPostExecute(Result)
, wird auf dem UI-Thread aufgerufen, nachdem die Hintergrundberechnung abgeschlossen ist. Das Ergebnis der Hintergrundberechnung wird diesem Schritt als Parameter übergeben. Threading Regeln
Es gibt ein paar Threading Regeln, die befolgt werden müssen, für diese Klasse richtig funktioniert:
Die Aufgabe Instanz auf dem UI-Thread erstellt werden müssen. ausführen (Params ...) muss im UI-Thread aufgerufen werden. Rufen Sie onPreExecute(), onPostExecute (Result), doInBackground (Params ...), onProgressUpdate (Progress ...) nicht manuell auf. Die Aufgabe kann nur einmal ausgeführt werden (eine Ausnahme, wenn eine zweite Ausführung versucht wird, geworfen werden.)
Beispielcode
Was der Adapter in diesem Beispiel tut, ist nicht wichtig, wichtiger zu verstehen, dass Sie brauchen Verwenden von AsyncTask, um einen Dialog für den Fortschritt anzuzeigen.
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 sollte idealerweise für kurze Operationen (ein paar Sekunden am meisten.) Verwendet werden [...]" - http://developer.android.com/ reference/android/os/AsyncTask.html –