【问题标题】:ProgressDialog in AsyncTask throws an exceptionAsyncTask 中的 ProgressDialog 抛出异常
【发布时间】:2010-06-25 21:02:09
【问题描述】:

我试图在我的AsyncTask 获取数据时显示一个简单的ProgressDialog。在我的onPreExecute() 方法中,我有这个:

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

c 是从this.getApplicationContext() 传递给我的AsyncTask 的构造函数的上下文。不幸的是,我不断收到这条消息的异常:

无法添加窗口 -- Token null 不适用于应用程序

我做错了什么?

更新:使用this 代替this.getApplicationContext() 发现了另一个问题。当我调用ProgressDialog.show(... 时,会显示一个ProgressDialog,但直到AsyncTask 完成后才会显示。换句话说,数据加载,然后显示对话框。如果我在onPostExecute() 中包含pd.dismiss(),那么我什至看不到对话框(可能是因为它在打开之前就关闭了)。

最终解决方案:事实证明,fetch.get() 占用了 UI 线程并且不让 ProgressDialog 显示。

【问题讨论】:

  • 这个问题已经回答stackoverflow.com/questions/1561803/…
  • Ally - 谢谢,但我不确定它是完全相同的问题。公认的解决方案是关于一个据称已在 1.6 中修复的 Android 错误(我使用的是 2.1)。我确实找到了另一种解决方案,即在主活动中创建一个静态方法来显示 ProgressDialog。这也有同样的问题,在加载数据之后才会显示对话框。

标签: android android-asynctask progressdialog


【解决方案1】:
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();
    }

【讨论】:

  • 这给出了完全相同的异常。
  • 那么你的上下文有问题。当你通过它时,将它从 this.getApplicationContext() 更改为 this。或者,如果 AsyncTask 是 Context 类私有的,只需使用对外部类的引用作为 MyClass.this
  • 使用this 而不是this.getApplicationContext() 可以消除异常,但不会显示任何对话框。 (onPostExecute 中的pd.dismiss() 也可以正常运行。)
  • @Computerish 尝试查看您的 SDK 文件夹中的示例,在我的示例上方,它仅适用于没有显示对话框的 Activity
  • 使用this 而不是this.getApplicationContext() 揭示了另一个问题。当我调用ProgressDialog.show(... 时,会显示一个ProgressDialog,但直到AsyncTask 完成后才会显示。换句话说,数据加载,然后显示对话框。如果我在onPostExecute() 中包含pd.dismiss(),那么我什至看不到对话框(可能是因为它在打开之前就关闭了)。
【解决方案2】:

试试这个

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

是的,我认为您的上下文也存在同样的问题。

【讨论】:

  • 使用this 而不是this.getApplicationContext() 可以消除异常,但不会显示任何对话框。 (onPostExecute 中的pd.dismiss() 也可以正常运行。)
  • 使用this 而不是this.getApplicationContext() 揭示了另一个问题。当我调用ProgressDialog.show(... 时,会显示一个ProgressDialog,但直到AsyncTask 完成后才会显示。换句话说,数据加载,然后显示对话框。如果我在onPostExecute() 中包含pd.dismiss(),那么我什至看不到对话框(可能是因为它在打开之前就关闭了)。
【解决方案3】:

使用YourClassName.this 而不是getApplicationContext()this.getApplicationContext()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2013-05-24
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多