无障碍服务getRootWindow导致ANR

0 人关注

我从我的crashlytics中得到了以下的ANR,但我不完全理解是什么原因造成的。根据 this post 它不应该导致ANR。我的XML文件中确实有 android:canRetrieveWindowContent="true"

撞车技术。

main (timed waiting): tid=1 systid=4160 
   at java.lang.Object.wait(Object.java)
   at java.lang.Object.wait(Object.java:442)
   at android.view.accessibility.AccessibilityInteractionClient.waitForResultTimedLocked(AccessibilityInteractionClient.java:896)
   at android.view.accessibility.AccessibilityInteractionClient.getFindAccessibilityNodeInfosResultAndClear(AccessibilityInteractionClient.java:791)
   at android.view.accessibility.AccessibilityInteractionClient.findAccessibilityNodeInfoByAccessibilityId(AccessibilityInteractionClient.java:454)
   at android.view.accessibility.AccessibilityInteractionClient.getRootInActiveWindow(AccessibilityInteractionClient.java:223)
   at android.accessibilityservice.AccessibilityService.getRootInActiveWindow(AccessibilityService.java:924)
   at com.myapp.services.Accessibility.onAccessibilityEvent(Accessibility.java:215)
   at android.accessibilityservice.AccessibilityService$2.onAccessibilityEvent(AccessibilityService.java:2096)
   at android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage(AccessibilityService.java:2299)
   at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:44)
   at android.os.Handler.dispatchMessage(Handler.java:106)
   at android.os.Looper.loop(Looper.java:246)
   at android.app.ActivityThread.main(ActivityThread.java:8653)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

Code:

public void onAccessibilityEvent(final AccessibilityEvent event)
   if (event.getSource() == null) { return; }
   if (getRootInActiveWindow() == null) { return; }
   AccessibilityNodeInfo node = getRootInActiveWindow(); <- this is the ANR line
   .....
   .....