search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

Android 開發 Tip 5 -- View xxx not attached to window manager

錯誤信息

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 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦