程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> dialog-Unable to add window--is your activity running?

dialog-Unable to add window--is your activity running?

編輯:編程解疑
Unable to add window--is your activity running?

android 判斷網絡連接問題,網絡連接不上的時候彈出提示框;問題是退出應用再一次進入時應用就直接掛掉了;報錯:android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@4255c7e0 is not valid; is your activity running?
代碼見下面;注銷掉部分是我嘗試解決的方法,但這樣做的問題是第二次Dialog好像會不出現,或者就是隔很久很久才出現(導致我以為沒有出現。。)反正就是有問題,能百度到的方法都試了,不行。。求大神幫忙

/**
     * 網連接超時提示
     */
    private void netTimeOut(){
             AlertDialog.Builder builder3 =new AlertDialog.Builder(MainActivity.this);
             builder3.setTitle(R.string.dia_title);
             builder3.setMessage(log_no);
             builder3.setNegativeButton(R.string.dia_retry, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    arg0.dismiss();
                    MainActivity.this.finish();
                    restartApplication();

                }
            });
             builder3.setPositiveButton(R.string.dia_exit, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                        arg0.dismiss();
                        ActivityManag.avtivityClose();

                    }
                });
             builder3.create().show();

            /*if(this.isTaskRoot()) {
                builder3.create().show();
            } else {
                builder3 = null;

            }*/

    } 

最佳回答:


is your activity running?對於new AlertDialog.Builder(MainActivity.this);中你的MainActivity是否已經啟動,然後再彈出對話框,不然對話框沒有
依附,所以報錯。

1,錯誤分析:

從錯誤信息我們也可以明白其原因,此問題根本原因就是由於將要彈出的dialog所要依附的View已經不存在導致的。

2,什麼地方可能照成此問題:當界面銷毀後再彈出來;或者界面跳轉時我們的view發生改變,dialog依附的context發生變化或者界面未運行了。

此外,很多時候我們需要通過一個非組件類來調用一個view類的方法來彈出dialog或Toast,這樣就需要再提供一個靜態context來創建這個dialog或者Toast

例如我們在一個view中通過一個靜態類來彈出一個對話框:AlertDialog.Builder builder = new AlertDialog.Builder(mContextNew);當然並不是所有靜態context都是可以用來創建dialog的,例如***App().getApplication().getApplicationContext()這個context就不行,因為它並不代表哪一個Activity或者View。。這樣就無法add這個dialog。

此view用於綁定顯示數據,我們在其構造方法中初始化一個靜態變量mContextNew為此view的mContext。這樣我們就可以通過一個靜態類來彈出對話框了,只需傳入這個靜態的context(mContextNew)就可以了。。但是這個靜態的context如果只在構造方法中初始化的話是會存在問題的,因為如果另起了一個界面其綁定數據的view也是用的這個view那麼這個靜態context就會被重新修改。。因此當這個新的界面finish後返回到上次的界面,這個靜態的context是剛才已經finish的view的context。因此如果仍然傳入這個靜態變量通過一個靜態類來彈出對話框就會出現上述找不到window的錯誤了。

解決辦法:

對於tab頁出現的錯誤可以用其父類的context來彈出dialog;對於界面已經銷毀引起的錯誤就只能判斷界面是否存在然後再彈出了;對於利用靜態context來彈出的dialog可以通過規避的方式來解決,比如避免出現靜態context被修改。。但是這樣就可能限制了我們程序的功能。。因此我們可以通過在bind數據時時時更新這個靜態context就可以解決此問題了,這樣就可以保證這個靜態的context在任何view中都是當前的界面的view的context。就不會出現找不到其父類window了。

u011249920
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved