一个Toast报错问题 java.lang.IllegalStateException: View has already been added to the window manager.

来源:互联网 发布:手机怎么禁止软件安装 编辑:程序博客网 时间:2024/06/05 17:47
1.进入应用,然后退出当前Activity,再进入应用,总是会报错。


10-28 17:54:20.104 29138-29138/com.letv.tv D/AndroidRuntime: Shutting down VM
10-28 17:54:20.106 29138-29138/com.letv.tv E/AndroidRuntime: FATAL EXCEPTION: main
                                                             Process: com.letv.tv, PID: 29138
                                                             java.lang.IllegalStateException: View com.letv.core.scaleview.ScaleRelativeLayout{ff1169b V.E...... ......I. 0,0-0,0} has already been added to the window manager.
                                                                 at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:281)
                                                                 at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
                                                                 at android.widget.Toast$TN.handleShow(Toast.java:430)
                                                                 at android.widget.Toast$TN$1.run(Toast.java:336)
                                                                 at android.os.Handler.handleCallback(Handler.java:739)
                                                                 at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                 at android.os.Looper.loop(Looper.java:148)
                                                                 at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:731)
                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:621)



2.查了半天也找不到原因,后来发现问题出在自定义的Toast。写了一个单例的Toast类,但是重新进入时,单例类还是之前的那个,view没有销毁;但是又重新被添加。所以才会报错。

private static volatile LeChildToast sInstance;public LeChildToast(Context context) {    super(context);    View view = LayoutInflater.from(context).inflate(R.layout.lechild_toast, null);    // 动态设置背景    int paddingLeft = view.getPaddingLeft();    int paddingTop = view.getPaddingTop();    int paddingRight = view.getPaddingRight();    int paddingBottom = view.getPaddingBottom();    view.setBackgroundDrawable(SkinManager.getDrawable(R.drawable.lechild_toast_bg));    view.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);    // 动态设置图标    View icon = view.findViewById(R.id.icon);    icon.setBackgroundDrawable(SkinManager.getDrawable(R.attr.lechild_drawable_lechild_toast_icon));    this.mTextView = (TextView) view.findViewById(R.id.msg);    this.setView(view);}public static void reset() {    sInstance = null;}

3.解决方案,在Activity的基类里,onDestory()的时候调用reset(),保证view可以被销毁。


0 0
原创粉丝点击