android.view.WindowManager$BadTokenException崩潰的4種情形

此文包含android.view.WindowManager$BadTokenException的4種情形:


  • 1.Unable to add window --token null is not valid; is your activity running

  • **2.Unable to add window --token null is not for an application **

  • 3.Unable to add window -- token android.os.BinderProxy@XXX is not valid;
    is your activity running

  • **4.Unable to add window -- token android.app.LocalActivityManager
    $LocalActivityRecord @xxx is not valid; is your activity running
    **


情形1.android.view.WindowManager$BadTokenException: Unable to add window --token null is not valid; is your activity running?異常處理。
$BadTokenException: Unable to add window -- 
token null is not valid; is your activity running 

E/AndroidRuntime(1412): at android.view.ViewRootImpl.setView(ViewRootImpl.java:538) 
......

該異常多見于Popup Window組件的使用中拋出烹吵。

原因:錯(cuò)誤在PopupWindow.showAtLocation(findViewById(R.id.main), Gravity.BOTTOM,0,0); popwindow必須依附于某一個(gè)view打颤,而在oncreate中view還沒有加載完畢,必須要等activity的生命周期函數(shù)全部執(zhí)行完畢于个,你需要依附的view加載好后才可以執(zhí)行popwindow氛魁。

解決辦法:showAtLocation()函數(shù)可以這樣改:

//修正后代碼
findviewById(R.id.mView).post(new Runnable() {
                        @Override
                        public void run() {
                                popwindow.showAtLocation(mView, Gravity.CENTER, 0, 0);

                        }
                });

總結(jié): PopupWindow必須在某個(gè)事件中顯示或者是開啟一個(gè)新線程去調(diào)用,不能直接在onCreate方法中顯示一個(gè)Popupwindow,否則永遠(yuǎn)會(huì)有以上的錯(cuò)誤秀存。

參考
http://stackoverflow.com/questions/4187673/problems-creating-a-popup-window-in-android-activity

情形2.android.view.WindowManager$BadTokenException: Unable to add window --token null is not for an application ?異常處理捶码。
$BadTokenException: Unable to add window -- 
token null is not for an application 

E/AndroidRuntime(1412): at android.view.ViewRootImpl.setView(ViewRootImpl.java:538) 
......

該異常多見于AlertDialog組件的使用中拋出。

//拋異常代碼
new AlertDialog.Builder(getApplicationContext())  //不能用getApplicationContext()
            .setIcon(android.R.drawable.ic_dialog_alert)  
            .setTitle("Warnning")  
            .setPositiveButton("Yes", positiveListener)
            .setNegativeButton(  "No", negativeListener)
            .create().show(); 

原因:導(dǎo)致報(bào)這個(gè)錯(cuò)是在于new AlertDialog.Builder(mcontext)或链,雖然這里的參數(shù)是AlertDialog.Builder(Context context)惫恼,但我們不能使用getApplicationContext()獲得的Context,而必須使用Activity,因?yàn)橹挥幸粋€(gè)Activity才能添加一個(gè)窗體。

解決方法:將new AlertDialog.Builder(Context context)中的參數(shù)用Activity.this(Activity是你的Activity的名稱)或者getActivity()來填充就可以正確的創(chuàng)建一個(gè)Dialog了澳盐。

//修正后代碼
new AlertDialog.Builder(this)  //this可以替換為MainActivity.this或getActivity()
            .setIcon(android.R.drawable.ic_dialog_alert)  
            .setTitle("Warnning")  
            .setPositiveButton("Yes", positiveListener)
            .setNegativeButton(  "No", negativeListener)
            .create().show(); 

參考
http://stackoverflow.com/questions/20779377/android-custom-dialog-gives-an-error

情形3.android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@XXX is not valid; is your activity running?異常處理祈纯。
android.view.WindowManager$BadTokenException: Unable to add window -- 
token android.os.BinderProxy@4250d6d8 is not valid; is your activity running?
    at android.view.ViewRootImpl.setView(ViewRootImpl.java:698)
   
    ......
    at dalvik.system.NativeStart.main(Native Method)

原因:從錯(cuò)誤信息我們也可以明白其原因,此問題根本原因就是由于將要彈出的dialog所要依附的View已經(jīng)不存在導(dǎo)致的叼耙。當(dāng)界面銷毀后再?gòu)棾鰜硗罂换蛘呓缑嫣D(zhuǎn)時(shí)我們的view發(fā)生改變,dialog依附的context發(fā)生變化或者界面未運(yùn)行了筛婉。

解決方法:界面已經(jīng)銷毀引起的錯(cuò)誤就只能判斷界面是否存在然后再?gòu)棾隽恕?/p>

//修正后代碼
if(!isFinishing()) {
     alert.show();
 }

參考
http://stackoverflow.com/questions/25554279/unable-to-add-window-token-android-os-binderproxy4250d6d8-is-not-valid-is-your

https://github.com/VKCOM/vk-android-sdk/issues/21

情形4.android.view.WindowManagerBadTokenException: Unable to add window -- token android.app.LocalActivityManagerLocalActivityRecord @xxx is not valid; is your activity running? 異常處理簇爆。
android.view.WindowManager$BadTokenException: Unable to add window -- 
token android.app.LocalActivityManager$LocalActivityRecord@43e5b158
is not valid; is your activity running?  
//異常代碼
TipDialog dialog = new TipDialog(XXX.this) ;

原因:因?yàn)閚ew對(duì)話框的時(shí)候,參數(shù)context 指定成了this爽撒,即指向當(dāng)前子Activity的context入蛆。但子Activity是動(dòng)態(tài)創(chuàng)建的,不能保證一直存在硕勿。其父Activity的context是穩(wěn)定存在的安寺,所以有下面的解決辦法。

解決方法:將context替換為getParent()即可首尼。 注意:要?jiǎng)?chuàng)建dialog對(duì)象挑庶,上下文環(huán)境必須是activity,同時(shí)若ActivityGroup中嵌套ActivityGroup,嵌套多少就該使用多少個(gè)getParent()。

//修正后代碼软能,只有最多一個(gè)parent的情形
TipDialog dialog = new TipDialog(getParent()) ; 
//修正后代碼迎捺,適用于一個(gè)或多個(gè)parent的情形
Activity activity = TestActivity.this;  
while (activity.getParent() != null) {  
    activity = activity.getParent();  
 }  
              
TipDialog dialog = new TipDialog(activity) ;                   

參考
http://stackoverflow.com/questions/9914195/webview-in-activity-group-crashing-on-dialogs

注:為什么要使用getParent我們可以從ActivityGroup的內(nèi)部機(jī)制來理解:

TabActivity的父類是ActivityGroup,而ActivityGroup的父類是Activity。因此從Ams的角度來看查排,ActivityGroup與普通的Activity沒有什么區(qū)別凳枝,其生命周期包括標(biāo)準(zhǔn)的start,stop,resume,destroy等,而且系統(tǒng)中只允許同時(shí)允許一個(gè)ActivityGroup.但ActivityGroup內(nèi)部有一個(gè)重要成員變量跋核,其類型為L(zhǎng)ocalActivityManager,該類的最大特點(diǎn)在于它可以訪問應(yīng)用進(jìn)程的主類岖瑰,即ActivityThread類。Ams要啟動(dòng)某個(gè)Activity或者贊同某個(gè)Activity都是通過ActivityThread類執(zhí)行的砂代,而LocalActivityManager類就意味著可以通過它來裝載不同的Activity,并控制Activity的不同的狀態(tài)蹋订。注意,這里是裝載刻伊,而不是啟動(dòng)露戒,這點(diǎn)很重要椒功。所謂的啟動(dòng),一般是指會(huì)創(chuàng)建一個(gè)進(jìn)程(如果所在的應(yīng)用經(jīng)常還不存在)運(yùn)行該Activity,而裝載僅僅是指把該Activity作為一個(gè)普通類進(jìn)行加載智什,并創(chuàng)建一個(gè)該類的對(duì)象而已动漾,而該類的任何函數(shù)都沒有被運(yùn)行。裝載Activity對(duì)象的過程對(duì)AmS來講是完全不可見的荠锭,那些嵌入的Activity僅僅貢獻(xiàn)了自己所包含的Window窗口而已旱眯。而子Activity的不同狀態(tài)是通過moveToState來處理的。

所以子Activity不是像普通的Activity一樣证九,它只是提供Window而已删豺,所以在創(chuàng)建Dialog時(shí)就應(yīng)該使用getParent獲取ActivityGroup真正的Activity,才可以加Dialog加入Activity中甫贯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市看蚜,隨后出現(xiàn)的幾起案子叫搁,更是在濱河造成了極大的恐慌,老刑警劉巖供炎,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渴逻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡音诫,警方通過查閱死者的電腦和手機(jī)惨奕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竭钝,“玉大人梨撞,你說我怎么就攤上這事∠愎蓿” “怎么了卧波?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)庇茫。 經(jīng)常有香客問我港粱,道長(zhǎng),這世上最難降的妖魔是什么旦签? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任查坪,我火速辦了婚禮,結(jié)果婚禮上宁炫,老公的妹妹穿的比我還像新娘偿曙。我一直安慰自己,他們只是感情好羔巢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布遥昧。 她就那樣靜靜地躺著覆醇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炭臭。 梳的紋絲不亂的頭發(fā)上永脓,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音鞋仍,去河邊找鬼常摧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛威创,可吹牛的內(nèi)容都是我干的落午。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼肚豺,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼溃斋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吸申,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤梗劫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后截碴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梳侨,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年日丹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了走哺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哲虾,死狀恐怖丙躏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情束凑,我是刑警寧澤彼哼,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站湘今,受9級(jí)特大地震影響敢朱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摩瞎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一拴签、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旗们,春花似錦蚓哩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喜颁。三九已至,卻和暖如春曹阔,著一層夾襖步出監(jiān)牢的瞬間半开,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工赃份, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寂拆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓抓韩,卻偏偏與公主長(zhǎng)得像纠永,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谒拴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容