在我們應用的線上反饋中,收集到了一些如下到crash。只出現在Android 8.0的手機中。並沒有找到任何其他有用的錯誤信息。
Exception: java.lang.IndexOutOfBoundsException: setSpan (-1 ... -1) starts before 0
at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1314)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:680)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:672)
at android.view.accessibility.AccessibilityNodeInfo.setText(AccessibilityNodeInfo.java:2474)
at android.widget.TextView.onInitializeAccessibilityNodeInfoInternal(TextView.java:10378)
at android.view.View.onInitializeAccessibilityNodeInfo(View.java:7307)
at android.view.View.createAccessibilityNodeInfoInternal(View.java:7266)
at android.view.View.createAccessibilityNodeInfo(View.java:7251)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:981)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1004)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1004)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchAccessibilityNodeInfos(AccessibilityInteractionController.java:806)
at android.view.AccessibilityInteractionController.findAccessibilityNodeInfoByAccessibilityIdUiThread(AccessibilityInteractionController.java:170)
at android.view.AccessibilityInteractionController.-wrap1(Unknown Source)
at android.view.AccessibilityInteractionController$PrivateHandler.handleMessage(AccessibilityInteractionController.java:1149)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:6565)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
在對日誌進行分析我們可以發現,他是涉及到了Android的無障礙相關的功能。而且是給文本設置ClickableSpan的時候出現的。在進行一系列的嘗試後,我發現,如下的代碼
SpannableString ss = new SpannableString("123");
ss.setSpan(new ClickableSpan(),1,1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(ss);
在正常的Android 8.0的使用中,並不會出現什麼問題,但是如果手機開啓了無障礙中的TalkBack功能的話,那麼這段代碼就必定會出現上述的crash。也就是說,在設置ClickableSpan的時候,如果設置的endIndex == startIndex 那麼就會出現crash,,但是在正常的使用中,是可以進行這樣的設置的,雖然沒有什麼顯示效果,但是並不會出現任何crash。所以,如果你也出現了類似的問題,就需要檢查一下相關代碼了。