【问题标题】:Android : BadTokenException when I want to show a progresssDialog a second timeAndroid:当我想第二次显示进度对话框时出现 BadTokenException
【发布时间】:2011-05-07 23:29:29
【问题描述】:

我有一个无法解决的问题...

在我的 Activity 中,我实例化了一个这样的类:

MapView mapView = (MapView) findViewById(R.id.mapview);
myMap = new Map(mapView, this);

构造函数是这样的

public Map(MapView mapView, Context context) {
    this.context = context;
    this.mapView = mapView;
}

我想做的是在这个类的过程中显示一个progressDialog,所以,在Map中,我得到了

private void showPath() {
    progressDialog = ProgressDialog.show(context, "Veuillez patienter", "Calcul de l'itinéraire en cours...", true, false);

    Thread thread = new Thread(this);
    thread.start();
}

当线程结束时,我会这样做

progressDialog.dismiss();

这行得通!但只有一次......如果我点击后退按钮,然后重新打开我的活动,我得到一个 BadTokenException

05-06 23:27:15.941: ERROR/AndroidRuntime(1247): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@44ecc8e8 is not valid; is your activity running?

我已经尝试了我找到的所有解决方案,但没有一个有效...甚至使用扩展 AsyncTask 的类。

感谢您的帮助

【问题讨论】:

    标签: android progressdialog


    【解决方案1】:

    正如错误消息告诉您的那样,这是因为您尝试在 Activity 中显示一个对话框,但 Activity 没有运行(已经完成?)。因此,在显示对话框之前,您可能需要确保 Activity 尚未完成:

    public class MyActivity extends Activity {
    
        public void showDialog(Dialog dialog) {
            if (!isFinishing()) {
                // If activity is not finished, then show this dialog.
                dialog.show();
            }
        }
    
    }
    

    【讨论】:

    • 好的,我明白了,但是我该怎么做呢?指令dialog.show(); 在我的课堂上,他不是活动...
    • 哦,它有效!但是我不知道我这样做的方式是否真的很好......我在我的类中创建了一个私有属性,它是一个Activity。我在构造函数中设置它,在我的方法中,我按照你告诉我的做:if (!isFinishing()) { // If activity is not finished, then show this dialog. dialog.show(); } 好还是不好?
    • 如果您的类中保留对 Activity 的引用的对象不是长期存在的对象,那么可以这样做。阅读this article关于避免Android文档中内存泄漏的更多解释。
    • 感谢这篇文章,非常有趣。
    猜你喜欢
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    相关资源
    最近更新 更多