java.lang.NullPointerException: Attempt to read from field 'int android.view.View.mPrivateFlags' on a null object reference 问题排查及解决方案
线上报这个堆栈异常:
java.lang.NullPointerException: Attempt to read from field 'int android.view.View.mPrivateFlags' on a null object reference at android.view.ViewGroup.resetCancelNextUpFlag(ViewGroup.java:2993) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2891) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3231) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2893) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3231) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2893) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3231) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2893) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3231) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2893) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:668) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1945) at android.app.Dialog.dispatchTouchEvent(Dialog.java:931) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:621) at android.view.View.dispatchPointerEvent(View.java:14754) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6647) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6405) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5866) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5933) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5894) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6056) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5902) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6113) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5870) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5933) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5894) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5902) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5870) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8762) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8713) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8665) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8902) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:238) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:339) at android.os.Looper.loop(Looper.java:208) at android.app.ActivityThread.main(ActivityThread.java:8399) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631) at com.android.internal.
经过分析,定位到问题复现路径是: 在一个Dialog弹窗中,这个Dialog弹窗有按钮 和 可弹起另一个弹窗的文本描述,并且当点击文本描述时,是执行了dismiss掉当前的弹窗,然后再弹起另一个弹窗。复现bug路径是:在该弹窗中,手指按下弹窗内的一个按钮,此时手指不要抬起,然后另个手指点击文本描述,此时出现崩溃,异常信息如上。
问题原因: 因为点击弹窗内的文本描述时,进行了dismiss当前弹窗的操作,而我们的另一个手指还在按钮上并没有抬起,此时点击弹窗内的文本描述时,进行了事件分发,与此同时弹窗已经被销毁,所以执行到分发事件的resetCancelNextUpFlag方法时,弹窗内的view已经为null,因此引起了上面的问题
解决方法: 点击文本描述时,不要dismiss当前的弹窗,直接调用hide隐藏弹窗即可,然后在页面onDestory时去dimiss掉弹窗即可。