2010-06-25 5 views
6

Я пытаюсь сделать простой ProgressDialog, пока мои AsyncTask извлекают данные. В моем onPreExecute() методе я это:ProgressDialog в AsyncTask выдает исключение

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

c контекст передается в конструктор моей AsyncTask из this.getApplicationContext(). К сожалению, я получаю исключение с этим сообщением:

Невозможно добавить окно - Токен нуль не для приложения

Что я делаю неправильно?

Обновление: Использование this вместо this.getApplicationContext() выявило еще одну проблему. Когда я звоню ProgressDialog.show(..., отображается индикатор ProgressDialog, но только после завершения AsyncTask. Другими словами, загружаются данные, а затем отображается диалоговое окно. Если я включу pd.dismiss() в мой onPostExecute(), тогда я даже не вижу диалог (предположительно потому, что он закрыт до того, как он когда-либо откроется).

Окончательное решение: Оказывается, что fetch.get() забивает поток пользовательского интерфейса и не пропускает отображение ProgressDialog.

+0

Этот вопрос был дан ответ http://stackoverflow.com/questions/1561803/android-progressdialog-show-crashes-with-getapplicationcontext – Ally

+1

Ally - Спасибо, но я не уверен, что это точно такая же проблема. Принятое решение касается ошибки Android, которая предположительно была установлена ​​в 1.6 (я использую 2.1). Я нашел другое решение, которое заключается в создании статического метода в основной деятельности для отображения ProgressDialog. Это имеет ту же самую проблему, когда диалог не отображается до тех пор, пока ПОСЛЕ того, что данные уже загружены. – Computerish

ответ

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

Это дает то же исключение. – Computerish

+4

Тогда что-то не так с вашим Контекстом. Измените это из 'this.getApplicationContext()' на просто 'this', когда вы его передадите. Или, если AsyncTask является приватным для класса Context, просто используйте ссылку на внешний класс как 'MyClass.this' – Pentium10

+0

Использование' this' вместо 'this.getApplicationContext()' избавляется от исключения, но диалог не отображается , ('pd.dismiss()' в 'onPostExecute' также работает без ошибок.) – Computerish

1

попробовать это

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

и да, я думаю, что то же самое, что проблема с вашим контекстом.

+0

Использование 'this' вместо' this.getApplicationContext() 'избавляется от исключения, но диалог не отображается. ('pd.dismiss()' in' onPostExecute' также работает без ошибок.) – Computerish

+1

Использование 'this' вместо' this.getApplicationContext() 'выявило еще одну проблему. Когда я вызываю 'ProgressDialog.show (...', отображается ProgressDialog, но только после завершения 'AsyncTask'. Другими словами, данные загружаются, а затем отображается диалог. Если я включаю' pd.dismiss() 'в моем' onPostExecute() ', тогда я даже не вижу диалог (предположительно, потому что он закрыт до того, как он когда-либо откроется). – Computerish

0

Использование YourClassName.this вместо использования getApplicationContext() или this.getApplicationContext()