Android runOnUiThread Erklärung
Ich versuche, Anzeige einer Fortschrittsanzeige während der onCreate () - Methode eines meiner Tätigkeiten die Arbeit zu füllen den Bildschirm erfolgt in einem thread, und dann schließen Sie das Dialogfeld mit dem Fortschritt.
Hier ist mein onCreateMethod()
dialog = new ProgressDialog(HeadlineBoard.this);
dialog.setMessage("Populating Headlines.....");
dialog.show();
populateTable();
Den populateTable Methode enthält mein thread und der code um das Dialogfeld zu schließen, aber für einige Grund. Die Aktivität kommt leer für etwa 10 Sek. (die populateTable() arbeiten), und dann habe ich den Bildschirm sehen. Ich nie sehen, das Dialogfeld angezeigt, irgendwelche Ideen?
Hier ist die populateTable () - code:
//Adds a row to the table for each headline passed in
private void populateTable() {
new Thread() {
@Override
public void run() {
//If there are stories, add them to the table
for (Parcelable currentHeadline : allHeadlines) {
addHeadlineToTable(currentHeadline);
}
try {
//code runs in a thread
runOnUiThread(new Runnable() {
@Override
public void run() {
dialog.dismiss();
}
});
} catch (final Exception ex) {
Log.i("---","Exception in thread");
}
}
}.start();
}
InformationsquelleAutor der Frage user1154644 | 2012-06-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie bereits die Daten "für (Parcelable currentHeadline : allHeadlines)," warum machst du das in einem separaten thread?
Sollten Sie Umfrage die Daten in einem separaten thread, und wenn es fertig ihn sammeln, dann rufen Sie Ihren populateTables Methode auf dem UI-thread:
InformationsquelleAutor der Antwort Cruceo
Sollte diese Arbeit für Sie
InformationsquelleAutor der Antwort K_Anas
Anstatt einen thread erstellt, und mit
runOnUIThread
ist dies der perfekte job für ASyncTask:In
onPreExecute
erstellen & zeigen Sie das Dialogfeld.in
doInBackground
vorbereiten die Daten, aber nicht berühren die UI -- speichern Sie jedes bereit datum in ein Feld, dann rufen SiepublishProgress
.In
onProgressUpdate
Lesen Sie die Nullpunkt-Feld & machen Sie die entsprechende änderung/Ergänzung der Benutzeroberfläche.In
onPostExecute
schließen Sie das Dialogfeld.Wenn Sie andere Gründe haben, zu wollen, dass ein thread, oder sind das hinzufügen von UI-berühren Logik zu einem vorhandenen thread, dann nicht eine ähnliche Technik, um das, was ich beschreibe, zu laufen auf dem UI-thread nur für kurze Zeit, mit
runOnUIThread
für jedes UI-Schritt. In diesem Fall, Sie speichern wird jedes datum in einem lokalenfinal
variable (oder ein Feld der Klasse), und dann verwenden Sie es innerhalb von einrunOnUIThread
block.InformationsquelleAutor der Antwort ToolmakerSteve