ANR при String.split

Использую для своих текстов классы для выравнивания текста с ГитХаба. Вот эти

Последнее время один из пользователей стал получать вот такой ANR (по логам из маркета):

#00  pc 000000000001f2ec  /system/lib64/libc.so (syscall+28)
  #00  pc 00000000000e0494  /system/lib64/libart.so (art::ConditionVariable::WaitHoldingLocks(art::Thread*)+148)
  #00  pc 00000000003805e8  /system/lib64/libart.so (art::JNI::GetIntArrayElements(_JNIEnv*, _jintArray*, unsigned char*)+484)
  #00  pc 0000000000023268  /system/lib64/libjavacore.so (MatcherState::updateOffsets(_JNIEnv*, _jintArray*)+60)
  #00  pc 0000000000023004  /system/lib64/libjavacore.so (Matcher_findNextImpl(_JNIEnv*, _jclass*, long, _jintArray*)+64)
  at java.util.regex.Matcher.findNextImpl (Native method)
  at java.util.regex.Matcher.find (Matcher.java:482)
  at java.util.regex.Pattern.split (Pattern.java:1127)
  at java.lang.String.split (String.java:2455)
  at java.lang.String.split (String.java:2497)
  at com.(мой_домен).(мой_пакет).TextJustifyUtils.createWrappedLine (TextJustifyUtils.java:100)
  at com.(мой_домен).(мой_пакет).TextViewEx.onDraw (TextViewEx.java:162)
  at android.view.View.draw (View.java:20483)
  at android.view.View.updateDisplayListIfDirty (View.java:19294)
  ...и т.д. в том же духе

Фрагмент кода с ошибкой:

 protected static Object[] createWrappedLine(String block, Paint paint, float spaceOffset, float maxWidth) {
        float cacheWidth = maxWidth;
        float origMaxWidth = maxWidth;
        StringBuilder line = new StringBuilder();

      !!!  for (String word : block.split("\\s")) { <== ANR вылетает здесь

            cacheWidth = paint.measureText(word);
            maxWidth -= cacheWidth;
            if (maxWidth <= 0) {
                return new Object[]{line.toString(), maxWidth + cacheWidth + spaceOffset};
            }
            line.append(word).append(" ");
            maxWidth -= spaceOffset;
        }
        if (paint.measureText(block) <= origMaxWidth) {
            return new Object[]{block, Float.MIN_VALUE};
        }
        return new Object[]{line.toString(), maxWidth};
    }

Текстов в приложении много, но вылетает только один. И далеко не у всех. Вынести в отдельный поток не получается - работаю с отображением текста.

Не понимаю, как оставить Split и побороть ANR.


Ответы (0 шт):