zoukankan      html  css  js  c++  java
  • bug_ _java.lang.IllegalArgumentException: View not attached to window manager

     ============= 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

     

     

     

  • 相关阅读:
    JavaScript Patterns 5.7 Object Constants
    JavaScript Patterns 5.6 Static Members
    JavaScript Patterns 5.5 Sandbox Pattern
    JavaScript Patterns 5.4 Module Pattern
    JavaScript Patterns 5.3 Private Properties and Methods
    JavaScript Patterns 5.2 Declaring Dependencies
    JavaScript Patterns 5.1 Namespace Pattern
    JavaScript Patterns 4.10 Curry
    【Android】如何快速构建Android Demo
    【Android】如何实现ButterKnife
  • 原文地址:https://www.cnblogs.com/awkflf11/p/5316548.html
Copyright © 2011-2022 走看看