2016-08-09 20 views
-1

In meiner App verwende ich einen ProgressDialog, um dem Benutzer anzuzeigen, dass einige Dienste ausgeführt werden. Ich starte den ProgressDialog in meiner Aktivität, aber es wird nicht korrekt angezeigt. Es wird nicht sofort gestartet. Gerade wenn der Dienst meistens fertig ist, erscheint er für eine Millisekunde und wird wieder ausgeblendet.Android ProgressDialog wird nicht korrekt angezeigt

Wie es funktioniert:

In meiner Tätigkeit habe ich einen Knopf. Wenn die Schaltfläche geklickt wird, starte ich den ProgressDialog und rufe eine AsyncTask für den Serviceaufruf auf. Wenn die AsyncTask beendet ist, überträgt sie (!) Das Ergebnis zurück an die Aktivität. Die AsyncTask hat keinen direkten Zugriff auf die Aktivität. Der ganze Prozess funktioniert gut. Aber nicht der ProgressDialog.

Die ProgressDialog-Variable ist ein Klassenmember.

+2

Sie müssen den Code in Ihre Frage einfügen, damit wir verstehen können, was tatsächlich passiert – Max

+0

Wenn 'ProgressDialog.show()' in 'OnPreExecute' aufgerufen wird, dann führen Sie auf der' AsyncTask' definitiv Blockierungscode aus. Nur weil Sie AsyncTask verwenden, heißt das nicht, dass der gesamte Code im Hintergrund ausgeführt wird. – SoroushA

Antwort

0

Dies sind die vier Schritte AsyncTask, sollten Sie die ersten onPreExecute() verwenden und die letzten onPostExecute(Result), zu zeigen und entlassen Ihre ProgressDialog

Wenn eine asynchrone Aufgabe ausgeführt wird, geht die Aufgabe über 4 Stufen :

1.- onPreExecute(), auf dem UIhread aufgerufen, bevor die Aufgabe ausgeführt wird. Dieser Schritt wird normalerweise zum Einrichten der Aufgabe verwendet, z. B. , indem eine Fortschrittsleiste in der Benutzeroberfläche angezeigt wird.

2.- doInBackground (Params ...), wird im Hintergrund-Thread aufgerufen, unmittelbar nachdem onPreExecute() die Ausführung beendet hat. Dieser Schritt wird verwendet, um Hintergrundberechnung durchzuführen, die eine lange Zeit 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 Einheiten des Fortschritts zu veröffentlichen. Diese Werte werden auf dem UI-Thread im Schritt onProgressUpdate (Progress ...) veröffentlicht.

3.- onProgressUpdate (Progress ...), wird im UI-Thread nach einem Aufruf von publishProgress (Progress ...) aufgerufen. Der Zeitpunkt der Ausführung ist undefined. Diese Methode wird verwendet, um jede Form des Fortschritts in der Benutzerschnittstelle anzuzeigen, während die Hintergrundberechnung noch ausgeführt wird. Zum Beispiel kann es verwendet werden, um einen Fortschrittsbalken zu animieren oder Protokolle in ein Textfeld anzuzeigen.

4.- onPostExecute (Ergebnis), wird im UI-Thread aufgerufen, nachdem die Hintergrundberechnung abgeschlossen ist. Das Ergebnis des Hintergrunds Berechnung wird an diesen Schritt als Parameter übergeben.

Info ab: https://developer.android.com/reference/android/os/AsyncTask.html

+0

Ich rufe ProgressDialog.show() und ProgressDialog.dismiss() in meiner Aktivität auf. So ist es innerhalb des Hauptthreads. In der doInBackground() - Methode der AsyncTask gibt es keine Behandlung. Welchen Unterschied macht es, show() in meiner Aktivität aufzurufen oder show() in der onPreExecute() -Methode aufzurufen? –

+0

AsyncTask ist eine Klasse, die es ermöglicht, Hintergrundoperationen durchzuführen und Ergebnisse auf dem UI-Thread zu veröffentlichen, ohne dass Threads und/oder Handler manipuliert werden müssen. Es ist also eine bessere Art zu programmieren, diese Klasse mit onPreExecute() zu verwenden, um diese Klasse zu initialisieren und alles vor dem Start der Hintergrundoperation im UI-Thread auszuführen und am Ende onPostExecute() zu verwenden, um alle Mitarbeiter im Hauptthread auszuführen . –

0

Sie haben AsyncTask Objekt in Ihrer Tätigkeit zu schaffen und die execute() -Methode aufrufen. Die CustomAsyncTask ist die innere Klasse.

ProgressDialog mProgressDialog; mProgressDialog = new ProgressDialog(PlayerView.this); CustomAsyncTask asyncTask = new CustomAsyncTask(); asyncTask.execute();

private class CustomAsyncTask extends AsyncTask<Void, Void, Void> { 


    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

      mProgressDialog.setMessage("Loading"); 
      mProgressDialog.setTitle("please wait"); 
      mProgressDialog.show(); 

    } 

    @Override 
    protected ArrayList<PlayerViewModel> doInBackground(Void... params) { 
     return //do yout doInBackground work here 
    } 

    @Override 
    protected void onPostExecute(Void void) { 
     //when your process completed hide the ProgressDialog 
     mProgressDialog.hide(); 
    } 
} 

Sie tun müssen, ist, dass der Fortschrittsdialog in der OnPreExecute() -Methode starten und die progressDialog im OnPostExecute Methode verstecken, weil diese beiden Methoden auf dem Haupt thred arbeiten.

Verwandte Themen