Fortschritt Dialog über offene Aktivität
-
27-09-2019 - |
Frage
Hey Leute, Ich habe ein Problem mit dem Fortschrittsdialog auf eine Aktivität Öffnung (Aktivität in Beispiel 2 bezeichnet). Die Aktivität 2 hat eine Menge Code in diesem OnCreate Ereignis auszuführen.
final ProgressDialog myProgressDialog = ProgressDialog.show(MyApp.this,getString(R.string.lstAppWait), getString(R.string.lstAppLoading), true);
new Thread() {
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
showApps();
}
});
myProgressDialog.dismiss();
}
}.start();
Die showApps Funktion Start Aktivität 2.
Wenn ich diesen Code ausführen auf meine Schaltfläche Click-Ereignis auf die Aktivität 1, sehe ich den Fortschritt, aber sie bewegt sich nicht und afeter ich habe einen schwarzen Bildschirm während 2 oder 3 Sekunden die Zeit für android die Aktivität zu zeigen.
Wenn ich in der OnCreate von Activity2 diesen Code auszuführen, und wenn ich die showApps durch den Code auf OnCreate ersetzen, einfrieren Activity1 2 Sekunden sehe ich nicht den Fortschrittsdialog und einfrieren wieder 2 Sekunden Aktivität 2 vor dem Sehen Ergebnis.
Eine Idee?
Lösung
Ich hatte das gleiche Problem und mit einem AsyncTask ist für mich arbeiten.
Es gibt drei wichtige Methoden in AsyncTask außer Kraft zu setzen.
- doInBackground : Das ist, wo das Fleisch von Ihrem Hintergrund Verarbeitung auftreten.
- OnPreExecute : zeigen Sie Ihre ProgressDialog hier (showdialog)
- OnPostExecute : verstecken Sie Ihre ProgressDialog hier (removeDialog oder dismissDialog )
Wenn Sie Ihre AsyncTask Unterklasse als eine innere Klasse Ihrer Tätigkeit zu machen, dann können Sie die Rahmen-Methoden aufrufen showdialog, dismissDialog und removeDialog aus Ihrem AsyncActivity.
Hier ist eine Beispielimplementierung von AsyncTask:
class LoginProgressTask extends AsyncTask<String, Integer, Boolean> {
@Override
protected Boolean doInBackground(String... params) {
try {
Thread.sleep(4000); // Do your real work here
} catch (InterruptedException e) {
e.printStackTrace();
}
return Boolean.TRUE; // Return your real result here
}
@Override
protected void onPreExecute() {
showDialog(AUTHORIZING_DIALOG);
}
@Override
protected void onPostExecute(Boolean result) {
// result is the value returned from doInBackground
removeDialog(AUTHORIZING_DIALOG);
Intent i = new Intent(HelloAndroid.this, LandingActivity.class);
startActivity(i);
}
}
Andere Tipps
AFAIK Sie können keine Aktivität vorzuladen mit Fortschrittsdialog angezeigt. Testen Sie auf einem realen Gerät oder in Emulator?
Ich habe Abhilfen gesehen, dass eine Aktivität mit einem ViewFlipper mit einem Fortschritt Animation in der Mitte geöffnet, und in der nächsten Ansicht, es wurde eine Aktivität geladen, aber es ist nicht etwas, wird empfohlen, und hart arbeiten, zu implementieren, wie Sie wollen .
GeeXor
Ich würde Ihnen vorschlagen, viele Operationen in Activity 2 der OnCreate.Writing viele Operationen in OnCreate ist ein Grund für den schwarzen Bildschirm zwischen activities.So zu vermeiden Durchführung perform diese Operationen asynchron mit AsyncTask oder in einem Thread (oder schreiben sie sie in onStart , wenn sie unvermeidbar sind).
Der andere Vorschlag ist, eine andere progressDialog in Tätigkeit 2 des onCreate zu starten, die ausgeführt werden, bis alle Daten geladen wird und Benutzer wissen, dass etwas im Hintergrund geschieht.
Das ist, was ich tun würde. einen Handler auf dem UI-Thread erstellen, die Hintergrundverarbeitung Thread starten und zeigt dann die progressdialog. wenn der Hintergrund-Thread hat es die Arbeit bekommen, es zu senden ein lauffähiges auf dem UI-Thread über den Handler schließen Sie den Dialog.
fertig