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?

War es hilfreich?

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.

  1. doInBackground : Das ist, wo das Fleisch von Ihrem Hintergrund Verarbeitung auftreten.
  2. OnPreExecute : zeigen Sie Ihre ProgressDialog hier (showdialog)
  3. 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top