你不知道的坑~android原聲alerdialog雙指觸摸必現crash

對不起,我TMD不想寫了,我覺得太複雜了,我說不清楚。。。

這個一個坑,安卓原聲機可以必現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)


發佈了71 篇原創文章 · 獲贊 22 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章