3C科技 娛樂遊戲 美食旅遊 時尚美妝 親子育兒 生活休閒 金融理財 健康運動 寰宇綜合

Zi 字媒體

2017-07-25T20:27:27+00:00
加入好友
錯誤信息java.lang.IllegalArgumentException: View=DecorView@f4179d7[title] not attached to window manager at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:473) at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:382) at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:124) at android.app.Dialog.dismissDialog(Dialog.java:363) at android.app.Dialog.dismiss(Dialog.java:346) at com.jacksen.demo.view.alertdialog.TestAlertDialogActivity$1.run(TestAlertDialogActivity.java:78) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 這類錯誤一般是由於調用Dialog.dismiss時,activity已經destory了。常見場景一般都是在做非同步操作(網路請求等)時,在回調函數中關閉對話框。還原現場progressDialog = ProgressDialog.show(this, "title", "loading..."); MyHandler handler = new MyHandler(this); handler.postDelayed(new Runnable { @Overridepublicvoidrun { progressDialog.dismiss; } }, 3000); handler.sendEmptyMessageDelayed(1, 1000); reference; publicMyHandler(TestAlertDialogActivity activity) { this.reference = new WeakReference(activity); } @OverridepublicvoidhandleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1 && reference.get != null && !reference.get.isFinishing) { reference.get.finish; } } }解決方案知道了問題原因,解決也很簡單。在dismiss的時候先判斷activity是否還存在。但是此時也要注意另外一個問題。即是你判斷了,也有可能出現另外一個錯誤,就是當你dismiss的時候,可能會出現 「xxx that was originally added here」!所以最好的方式是在關閉activity的時候,及時調用dismiss來解除對ProgressDialog等Dialog的引用!

本文由yidianzixun提供 原文連結

寫了 5860316篇文章,獲得 23313次喜歡
精彩推薦