Sie sollten dies tun, mit Hilfe von AsyncTask (ein intelligenter Hintergrund-Thread) und ProgressDialog
AsyncTask ermöglicht korrekte und einfache Nutzung des UI-Thread. 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 Task wird durch eine Berechnung definiert, die auf einem Hintergrundthread ausgeführt wird und deren Ergebnis im UI-Thread veröffentlicht wird. 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 ...), wird im Hintergrund-Thread aufgerufen, unmittelbar nachdem onPreExecute() die Ausführung beendet hat. 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 ...), wird im UI-Thread nach einem Aufruf von publishProgress (Progress ...) aufgerufen. 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 (Ergebnis), 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 Regeln, die Threading für diese Klasse befolgt werden müssen, um richtig zu arbeiten:
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 ...) und onProgressUpdate (Progress ...) nicht manuell auf. Die Aufgabe kann nur einmal ausgeführt werden (eine Ausnahme ausgelöst wird, wenn eine zweite Ausführung versucht wird.)
Beispielcode: Was der Adapter funktioniert in diesem Beispiel ist nicht wichtig, wichtiger zu verstehen, dass Sie brauchen, um Verwenden Sie 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();
}
}
danke, ich versuche Ihren Code, es kann immer noch nicht zeigen, dass die Daten sofort ändern. Es gibt keine Fehlermeldung. Die fügen nur erfolgreich wie mein Code. –
was meinst du, wenn du ** sofort ** sagst? –
debuggen und schauen, wo Daten gelöst sind –