Android:AsyncTask ProgressDialog 不会在 ActivityGroup 中打开

Posted

技术标签:

【中文标题】Android:AsyncTask ProgressDialog 不会在 ActivityGroup 中打开【英文标题】:Android: AsyncTask ProgressDialog will not open in ActivityGroup 【发布时间】:2011-05-18 19:12:09 【问题描述】:

我试图在轮询我的服务器时打开一个进度对话框。该类是一个 ActivityGroup,因为它嵌套在选项卡栏中。要将视图保持在框架内,需要 ActivityGroup。这是我的 ActivityGroup 类的声明:

   public class CheckInActivity extends ActivityGroup
        ...
        public void onCreate(Bundle savedInstanceState)
        super.onCreate(savedInstanceState);
        setContentView(R.layout.checkin);
            new LocationControl().execute(this);

现在我的 AsyncTask 类在同一个 CheckInActivityClass 中:

private class LocationControl extends AsyncTask<Context, Void, Void>
    
        private final ProgressDialog dialog = new ProgressDialog(CheckInActivity.this);

        protected void onPreExecute()
        
            this.dialog.setMessage("Determining your location...");
            this.dialog.show();
        

当我运行给定的应用程序时,它会遇到与 WindowManager$BadTokenException 相关的错误。说明它无法使用未知令牌启动窗口。我尝试制作一个只是常规 Activity(不是 ActivityGroup)的示例应用程序,它工作得很好。

有谁知道如何修改它以使其工作,或者解决方法可以让进度条嵌套在标签栏中?非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

如果 ActivityGroup 位于 TabActivity 中,则您有超过两个级别的嵌套活动。 android 目前不支持此功能,但有一种解决方法。您必须将父活动传递给对话框。

为此在活动类中创建一个辅助方法:

private Context getDialogContext() 
    Context context;
    if (getParent() != null) context = getParent();
    else context = this;
    return context;

那就换行

private final ProgressDialog dialog = new ProgressDialog(CheckInActivity.this);

private final ProgressDialog dialog = new ProgressDialog(getDialogContext());

【讨论】:

【参考方案2】:

这里简单你也可以使用下面的

private final ProgressDialog dialog = new ProgressDialog(getParent());

它非常适合我。

【讨论】:

【参考方案3】:

如果 getParent() 对您不起作用,请尝试仅使用 TabsActivity.context(或替换您的父选项卡活动类的名称)。我正在使用嵌套活动,因此使用 getParent() 仍然没有为对话框返回正确的上下文,因为它需要扩展 TabsActivity 的活动上下文,而不是直接父级。

简单修复:

    您需要在 TabsActivity 类中创建一个上下文变量。 onCreate 方法中的 public static TabsActivity context;context=this 之类的东西。

    替换您创建对话框的这一行:

    AlertDialog.Builder builder = new AlertDialog.Builder(this);

与:

AlertDialog.Builder builder = new AlertDialog.Builder(TabsActivity.context); 

它就像一个魅力。

【讨论】:

以上是关于Android:AsyncTask ProgressDialog 不会在 ActivityGroup 中打开的主要内容,如果未能解决你的问题,请参考以下文章

Android自助餐之AsyncTask

android:如果一个 AsyncTask 已经在运行,则阻止另一个 AsyncTask 执行

android asynctask怎么用

Android AsyncTask分析

android中 如果要你来设计AsyncTask,你怎么设计

Android - 强制取消 AsyncTask