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可以被销毁。