Если вы не выполняете только однострочное регулярное выражение / выделение, предложенная вами стратегия может не сработать. Например, вы, вероятно, не можете определить, есть ли у вас многострочный комментарий, без сканирования нескольких строк. : -)
Если вы еще этого не сделали, используйте Traceview, чтобы определить, где конкретно находятся замедления. Может быть, вы можете оптимизировать достаточно других вещей. Например, возможно, вы компилируете все свои Pattern
объекты на лету, а не определяете их статически.
Кроме того, я думаю, что типичным примером является применение подсветки синтаксиса только тогда, когда пользователь делает паузу. Один из возможных способов реализации этого будет:
Шаг # 1: При каждом изменении текста (которое вы, вероятно, уже подключили), postDelayed()
a Runnable
и сохраняйте метку времени, полученную из SystemClock.uptimeMillis()
, в элементе данных вашего подкласса EditText
(или где-либо еще). у вас есть логика раскраски синтаксиса). Для целей этого ответа я буду называть ваш период задержки, который вы используете с postDelayed()
, как DELAY
.
Шаг # 2: Runnable
сравнивает текущее время с SystemClock.uptimeMillis()
со временем последнего изменения текста. Если разница во времени меньше, чем DELAY
, вы знаете, что пользователь что-то набрал между тем, когда это Runnable
было запланировано, и сейчас, так что вы просто ничего не делаете. Однако, если разница во времени> = DELAY
, вы выполняете логику раскраски синтаксиса.
Таким образом, вы пропускаете применение раскраски синтаксиса до тех пор, пока пользователь не остановится, тем самым не прерывая его ввод. Вы можете настроить DELAY
или, возможно, настроить его.
Кстати, вы планируете выпустить это как библиотеку с открытым исходным кодом, верно? : -)