最近公司開會決定,app中的消息傳遞廢棄CS架構,改用消息隊列, 額 ,一臉懵逼,話不多說,說一下坑吧
,因為額,項目經理喜歡彈框的樣式,就自己定義了一個彈框樣子差不多是這樣。
額 ,假裝有一張圖 .....
這個界面要接受消息隊列,然后自動給用戶彈出來dialog,顯示有商家回復你的訂單,開始測試的時候沒有問題,但是如果用戶頻繁的取消訂單,再下單,就會出現以下問題
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@406ab4c8 is not valid; is your activity running?
what?,is your activity running?,這個是當前的activity,怎么回報這個錯誤。查了一下資料。
dialog是需要依附于activity存在的,當activity銷毀的時候,如果執行dialog.show 就會以下,
于是代碼改成了
if(!Activity.this.isFinishing()) {
dialog.show
}else{
Log.d("flag","===========Activity.this.isFinishing()");
}
發現不報錯了,但是,有的時候會直接走else,activity顯示銷毀狀態,
檢查了以下代碼,在onDestory()方法執行的時候,檢查了dialog是不是顯示,如果顯示,讓他隱藏,是不是為空,如果不為空,則制空,這些都判斷了,最后查閱資料顯示,窗體泄露主要是當前的activity,要接收消息隊列,不能完全銷毀,雖然activity跟windows分離,但是不會完全銷毀。
最后的解決辦法是,在其他的activity接收消息隊列,通過EnvetBus Post到這個顯示dialog的頁面。進行顯示doalog。