2010-06-25 5 views
6

Ich versuche, eine einfache ProgressDialog erscheinen, während meine AsyncTask Daten abrufen. In meiner onPreExecute() Methode Ich habe dies:ProgressDialog in AsyncTask löst eine Ausnahme

pd = ProgressDialog.show(c, "Loading...", "Please wait"); 

c ist der Kontext, in den Konstruktor meines AsyncTask von this.getApplicationContext() geben. Leider habe ich immer eine Ausnahme mit dieser Nachricht bekommen:

Unable Fenster hinzufügen - Token null ist nicht für eine Anwendung

Was mache ich falsch?

Update: Mit this anstelle von this.getApplicationContext() hat ein anderes Problem aufgedeckt. Wenn ich ProgressDialog.show(... aufrufen, wird ein ProgressDialog angezeigt, aber erst nachdem die AsyncTask abgeschlossen ist. Mit anderen Worten, die Daten werden geladen und dann wird der Dialog angezeigt. Wenn ich pd.dismiss() in meinem onPostExecute() einschließe, dann sehe ich den Dialog nie (vermutlich weil er geschlossen ist, bevor er überhaupt geöffnet wird).

Endgültige Lösung: Es stellt sich heraus, dass fetch.get() den UI-Thread hogging und nicht den ProgressDialog anzeigen ließ.

+0

mit dieser Frage http://stackoverflow.com/questions/1561803/android-progressdialog-show-crashes-with-getapplicationcontext – Ally

+1

Ally beantwortet wurde - Danke, aber ich bin mir nicht sicher, es ist genau das gleiche Problem. Die akzeptierte Lösung handelt von einem Android-Bug, der angeblich in 1.6 behoben wurde (ich benutze 2.1). Ich habe eine andere Lösung gefunden, nämlich eine statische Methode in der Hauptaktivität zu erstellen, um den ProgressDialog anzuzeigen. Dies hat das gleiche Problem, bei dem der Dialog erst NACH dem Laden der Daten angezeigt wird. – Computerish

Antwort

4
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(); 
    } 
+0

Dies gibt die exakt gleiche Ausnahme. – Computerish

+4

Dann ist etwas falsch mit Ihrem Kontext. Ändern Sie das von 'this.getApplicationContext()' in "this", wenn Sie es übergeben. Oder wenn die AsyncTask für eine Context-Klasse privat ist, verwenden Sie einfach den Verweis auf die äußere Klasse als 'MyClass.this' – Pentium10

+0

Die Verwendung von' this' anstelle von 'this.getApplicationContext()' beseitigt die Ausnahme, aber es wird kein Dialog angezeigt . ('pd.dismiss()' in 'onPostExecute' läuft auch ohne Fehler.) – Computerish

1

versuchen diese

this.pd = ProgressDialog.show(this,"Loading...", "Please wait", true, false); 

und ja ich glaube, das gleiche Problem mit Ihrem Kontext ist.

+0

Mit 'this' anstelle von' this.getApplicationContext() 'wird die Ausnahme beseitigt, aber es wird kein Dialog angezeigt. ('pd.dismiss()' in 'onPostExecute' läuft ebenfalls ohne Fehler.) – Computerish

+1

Die Verwendung von' this' anstelle von 'this.getApplicationContext()' hat ein anderes Problem ergeben. Wenn ich 'ProgressDialog.show (...' aufrufe, wird ein ProgressDialog angezeigt, aber erst nachdem die 'AsyncTask' abgeschlossen ist. Mit anderen Worten, die Daten werden geladen und dann wird der Dialog angezeigt. Wenn ich' pd.dismiss() 'in meinem' onPostExecute() 'dann sehe ich nie den Dialog (vermutlich, weil es geschlossen wird, bevor es jemals geöffnet wird). – Computerish

0

Verwenden YourClassName.this statt getApplicationContext() oder this.getApplicationContext()

Verwandte Themen