你不知道的坑~android原声alerdialog双指触摸必现crash

 

这个一个坑,安卓原声机可以必现crash。

关于详细逻辑,后面再梳理并书写,目前还没梳理完成,细节还很多没有确定的。

这里先把主干写一下,免得忘了。后面在逐步进行填充修改,最后本文将呈现一个详细的dispatchTouchEvent的派发逻辑:难点在多点触控,而且你会发现单点触控的逻辑就是小菜一叠。

注:本文在完成终稿之前,平均

干货,上trace:(末尾)

关键函数:

1.ViewGroup:public boolean dispatchTouchEvent(MotionEvent ev)

2.ViewGroup:private boolean dispatchTransformedTouchEvent(MotionEvent event, boolean cancel,View child, int desiredPointerIdBits)

3.ViewGroup:private TouchTarget addTouchTarget(@NonNull View child, int pointerIdBits)

4.ViewGroup:private static boolean resetCancelNextUpFlag(@NonNull View view)

5.MotionEvent:public final MotionEvent split(int idBits) 

关键变量:

1.MotionEvent

2.mFirstTouchTarget

3.TouchTarget类中的参数

 

概述:

关键函数:

1.事件分发主要逻辑,包括intercept及cancel;

2.子事件的分发,决定是否给最终的view还是继续走viewgroup的分发;这里也很关键,MotionEvent事件的转换也是这个函数做的(UP事件变CANCEL等,后面补充会详细讲解)

3.给关键变量2赋值,并且对关键变量3进行更新赋值(多点触,会形成链表,单点的不会有链表,表被这个逼类骗了。。好坑)

4.不说了,就这里crash的。

5.2中说的事件转换,就是这个函数干的。

关键变量:

1.事件,没啥说的,却很关键

2.第一个接受down事件的view对应的TouchTarget

3.里面的参数保留了touch事件遍历的view及手指信息,所有的操作都要依据这个类中的变量而进行。

 

目前:双指触,抬起手指,触发了dialog的dismiss,因此ACTION_POINTER_UP--ACTION_UP--ACTION_CANCEL,最终在crash的时候,ACTION_CANCEL--ACTION_UP,然后ACTION_CANCEL的逻辑中触发了recyle,导致up的处理的时候发生crash。

这点逻辑还待继续check,后续更新。。。

 

 

01-01 08:22:11.675  2528  2528 D lstvg   : lstvg start ev : MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=0.0, y[0]=0.0, toolType[0]=TOOL_TYPE_UNKNOWN, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=183639, downTime=183639, deviceId=0, source=0x1002 }
01-01 08:22:11.677  2528  2528 D lstvg   : Throw
01-01 08:22:11.677  2528  2528 D lstvg   : java.lang.Throwable
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2475)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2952)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2666)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2952)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2666)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2952)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2666)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2952)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2666)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2952)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.cancelAndClearTouchTargets(ViewGroup.java:2801)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:3672)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl.dispatchDetachedFromWindow(ViewRootImpl.java:3462)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl.doDie(ViewRootImpl.java:6310)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl.die(ViewRootImpl.java:6287)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.WindowManagerGlobal.removeViewLocked(WindowManagerGlobal.java:458)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:396)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:123)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.app.Dialog.dismissDialog(Dialog.java:371)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.app.Dialog.dismiss(Dialog.java:354)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.preference.ListPreference$1.onClick(ListPreference.java:264)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1142)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.widget.AdapterView.performItemClick(AdapterView.java:318)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.widget.AbsListView.performItemClick(AbsListView.java:1165)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.widget.AbsListView$PerformClick.run(AbsListView.java:3134)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.widget.AbsListView.onTouchUp(AbsListView.java:4061)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.widget.AbsListView.onTouchEvent(AbsListView.java:3820)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.View.dispatchTouchEvent(View.java:11721)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2976)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2649)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2982)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2666)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3004)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2666)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2982)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2666)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2982)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2666)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2982)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2666)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:445)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1828)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.app.Dialog.dispatchTouchEvent(Dialog.java:823)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:407)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.View.dispatchPointerEvent(View.java:11960)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4776)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4590)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4181)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4147)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4274)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4155)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4331)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4181)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4147)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4155)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4128)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6642)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6616)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6577)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6746)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
01-01 08:22:11.677  2528  2528 D lstvg   : 	at android.os.MessageQueue.nativePollOnce(Native Method)

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值