============= 1 view not attached to window manager
|
以下轉自:http://blog.csdn.net/gaofeiyunb/article/details/5304936 今天在發布到開發板測試時發現java.lang.illegalargumentexception: view not attached to window manager問題 引起的原因: A應用在使用Intent顯示啟動其他應用,當關閉其他應用顯A應用界面時報錯。 解決方法1: A應用使用startActivityForResult(intent)啟動其他應用 解決方法2: 關閉其他應用時每次都使用Intent重新拉起一遍A應用 ************************************** 我的問題是:在A中啟動B,B中有線程操作,結束時涉及到對話框的dismiss。如果在操作尚未結束時,按下HOME鍵,線程后台操作。此時重新進去A,等到線程操作完成就會出現這個異常。此時應該做一個判斷,如下: // Dismiss the Dialog only when the parent Activity is still alive.if ( SelectContactsActivity!=null&& !SelectContactsActivity.this.isFinishing()) { mProgressDialog.dismiss(); }
沒有看懂,先收下。
|
======= 1 解決安卓懸浮窗異常:java.lang.IllegalArgumentException
本文章由亓根火柴原創,轉載請注明出處:http://blog.csdn.net/qigenhuochai/article/details/42678587
在開發安卓懸浮窗的過程中有可能會遇到這個異常:java.lang.IllegalArgumentException: View not attached to window manager。
原因:如果是在執行android.view.ViewManager.updateViewLayout(View view, LayoutParams params)這個方法時出錯,表示在調用該方法前,該view並沒有附加到ViewManager。
就是之前沒有執行這個方法android.view.ViewManager.addView(View view, LayoutParams params),或者說 updateViewLayout方法在addView方法之前執行了。
解決方法:執行addView方法,並且updateViewLayout方法要在addView方法之后執行。
注意:重復執行addview添加同一個view會報其它錯誤,注意避免。
========1 java.lang.IllegalArgumentException: View not attached to window manager
- at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:653)
- at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:349)
- at android.view.WindowManagerImpl$CompatModeWrapper.removeView(WindowManagerImpl.java:160)
- at android.app.Dialog.dismissDialog(Dialog.java:319)
- at android.app.Dialog.dismiss(Dialog.java:302)
- at android.app.Dialog.cancel(Dialog.java:1104)
- at android.app.Dialog.onTouchEvent(Dialog.java:617)
- at android.app.Dialog.dispatchTouchEvent(Dialog.java:739)
- at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1890)
- at android.view.View.dispatchPointerEvent(View.java:7323)
- at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3200)
- at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3145)
- at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4181)
今天在寫程序中遇到如下問題,如此怪異,在網上找了很多,終於解決了問題:
java.lang.IllegalArgumentException: View not attached to window manager
解決方法:
在調用系統相機拍照相片后返回 protected void onActivityResult(int requestCode, int resultCode, Intent data)方法,那么可能會拋出這個異常,
原因就是返回activity后,重新運行onCreate方法,那些view重新畫出來,某些需要初始化的變量沒有設置好。
處理這個問題,只要有兩種方法:(關鍵第二點)
1. 限制屏幕翻轉
可在AndroidManifest.xml中設定android:screenOrientation=”portrait”
2. 如果是需要翻轉的,那么限制那些view做重畫動作。
可在AndroidManifest.xml中設定android:configChanges=”orientation|keyboardHidden|navigation”
==== ============ 1 View not attached to window manager解決方案
前幾日出現這樣一個Bug是一個RuntimeException,詳細信息是這樣子的:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:356)
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:201)
at android.view.Window$LocalWindowManager.removeView(Window.java:400)
at android.app.Dialog.dismissDialog(Dialog.java:268)
at android.app.Dialog.access$000(Dialog.java:69)
at android.app.Dialog$1.run(Dialog.java:103)
at android.app.Dialog.dismiss(Dialog.java:252)
at xxx.onPostExecute(xxx$1.java:xxx)
首先是Google了下,發現引發這個的原因基本上都一致都是 Dismiss對話框的時候,Activity已經不再存在。
常發生這類Exception的情形都是,有一個費時的線程操作,需要在顯示一個ProgressDialog,在任務開始的時候顯示一個對話框,然后當任務完成了再Dismiss對話框,如果在此期間如果Activity因為某種原因被殺掉且又重新啟動了,
那么當Dismiss的時候WindowManager檢查發現Dialog所屬的Activity已經不存在了,所以會報IllegalArgumentException: View not attached to window manager.
其實此類Exception的一重要的原因是,ProgressDialog的創建顯示和取消 都允許在非UI線程中進程。在Android當中非UI線程是不允許操作UI相關的事情,比如添加移除View等,但是為會么允許創建顯示和取消對話框呢?而且還有可能引發此Exception導致應用Crash。
要想避免此類Exception,就要正確的使用對話框,也要正確的使用線程。
正確的使用對話框。不要在非UI線程中使用對話框創建,顯示和取消對話框。
那么對於異步操作顯示對話框怎么辦呢?
Activity都有相應的操作對話框的回調。比如onCreateDialog(),showDialog(),dimissDialog(),removeDialog()等等。這些因為都是Activity的方法,所以用起來更方便,也不用顯示創建和操控Dialog對象,一切都由框架操控,相對來說比較安全。
另外就是一定要讓對話框對象在Activity的可控制范圍之內和生命周期之內,比如一定要是它的成員變量,並且在讓對話框變量活躍在Activity的onCreate()和onDestroy()之間。
盡量少用單獨線程,除非是真正的費時操作才用線程,線程也不要直接用Java式的匿名線程,除非是那種單純的操作,操作完成后不需要做其他事情的。
盡可能多用Android提供的類比如AsyncTask等。
另外,如果線程操作過程中還需要與主線程有交互,那么最好保存一個線程的對象,並且線程內部最有一定的控制,這樣可以讓Activity更好的操控線程。
如果說某些操作是特別費時的,且是經常性的操作,比如從網絡獲取數據,或是從后台讀取文件,或是導入/導出,恢復/備份的事情,最好放到后台Service中去做,然后在StatusBar中給出相應進度。
同樣的問題,還會發生在Dialog 和PopopWindow 的dissmiss過程中。對應Dialog,Activity提供了統一的方法來管理對象的創建和銷毀等,建議使用此類方法。
對於PopopWindow對象,建議子銷毀的時候判斷當前Activity是否被finish。
if(mAcitvity!=null && !mAcitivity.isFinish()){
popwindow.dissmiss();
}
隨便提醒下,可能存在已知或未知的acitvity關閉的地方,比方說,旋轉屏,如果沒做處理,會導致activity重建。
參考:http://blog.csdn.net/xpsharp/article/details/7378832
