【发布时间】:2023-01-31 00:21:38
【问题描述】:
三星及其特殊键盘实现会导致 ANR 或 EditText 崩溃。
ANR 看起来像
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:930)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:934)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:914)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:934)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:914)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:934)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:934)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:914)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:934)
android.text.SpannableStringBuilder.getSpans (SpannableStringBuilder.java:885)
android.text.SpannableStringBuilder.getSpans (SpannableStringBuilder.java:863)
androidx.emoji2.text.SpannableBuilder.getSpans (SpannableBuilder.java:159)
如果您在 editText 中使用 span,Samsung 会在文本编辑期间乘以 span。跨度的数量呈指数增长,因此您将在大约 15-20 秒内收到 ANR。基本上,每次您在 EditText 内部单击时,都会创建新的 span。我能够发现乘法发生在SpannableStringBuilder.replace 方法中,但无法查看源代码,因为我认为三星使用自己的实现。
这可能与建议在三星键盘内的实施方式有关。正如我从 https://github.com/facebook/react-native/issues/33139 中发现的那样,如果您将输入类型设置为“可见密码”或“电子邮件地址”,跨度将停止增加。
但是崩溃来了。
Fatal Exception: java.lang.IndexOutOfBoundsException
setSpan (0 ... -1) has end before start
据我所知,崩溃发生在您开始编辑文本时。
我没有发现很多关于这个问题的提及,但可以肯定的是,在他们的代码库中使用 span 的任何人都会受到影响。例如,这是处理相同问题的 Grammarly 线程 - https://github.com/facebook/react-native/issues/35590
那么问题是有人能够找到另一种解决方案吗?您是否也在为 Android 13 三星的更新而苦恼?
如果我找到任何更新,我会发布任何更新。
【问题讨论】: