AsyncTask中的ProgressDialog抛出异常

6

我正在尝试在我的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显示。


这个问题已经得到解答。https://dev59.com/GHI_5IYBdhLWcg3wBuRs - Ally
1
Ally - 谢谢,但我不确定这是否完全是同一个问题。被接受的解决方案是关于一个 Android 的 bug,据说在 1.6 版本中已经修复了(我使用的是 2.1 版本)。我找到了另一个解决方案,就是在主活动中创建一个静态方法来显示 ProgressDialog。这个方法存在同样的问题,即对话框直到数据已经加载完毕后才会显示。 - Computerish
3个回答

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

这会产生完全相同的异常。 - Computerish
4
如果您的上下文出现问题,请将this.getApplicationContext()更改为仅使用this进行传递。或者,如果AsyncTask是Context类的私有成员,则可以使用外部类的引用作为MyClass.this - Pentium10
@Computerish 试着查看你的SDK文件夹中的示例,在我的示例上方,它适用于没有显示对话框的Activity。 - Pentium10
请发布您的AsyncTask的完整代码以及调用execute()方法的方法。编辑原始问题。 - Pentium10
你可以在 onProgressUpdate 方法或者 onPostExecute 方法中进行界面的一些更改,两个方法都运行在 UI 线程上。根据你的需要选择适合的方法即可。 - Pentium10
显示剩余7条评论

1

试一下这个

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

是的,我认为问题出在你的上下文。


使用this替换this.getApplicationContext()可以消除异常,但没有显示对话框。(onPostExecute中的pd.dismiss()也能够正常执行而不报错.) - Computerish
1
使用this代替this.getApplicationContext()揭示了另一个问题。当我调用ProgressDialog.show(...时,会显示一个ProgressDialog,但是直到AsyncTask完成后才会显示。换句话说,数据加载完毕后才显示对话框。如果我在我的onPostExecute()中包含pd.dismiss(),那么我甚至看不到对话框(可能是因为它在打开之前就关闭了)。 - Computerish

0

在编程中,使用YourClassName.this代替getApplicationContext()this.getApplicationContext()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接