Разработка Android: эффективные советы по выделению синтаксиса? - PullRequest
4 голосов
/ 22 июля 2011

Я разработал свою собственную библиотеку подсветки синтаксиса для Android, и она прекрасно работает, но проблема в том, что она замедляет набор текста.

Я пытался использовать AsyncTask для выполнения регулярных выражений вЗатем фон применяет необходимые цвета, но он все еще замедляет процесс набора.

В настоящее время он читает весь EditText, я думал вместо этого получить строку, на которой находится текстовый курсор, получить эти строки CharSequence, затем выполнить обычнуювыражения в этой строке вместо всего документа, но я действительно не знаю, как получить строку, над которой работает пользователь: (.

1 Ответ

4 голосов
/ 22 июля 2011

Если вы не выполняете только однострочное регулярное выражение / выделение, предложенная вами стратегия может не сработать. Например, вы, вероятно, не можете определить, есть ли у вас многострочный комментарий, без сканирования нескольких строк. : -)

Если вы еще этого не сделали, используйте Traceview, чтобы определить, где конкретно находятся замедления. Может быть, вы можете оптимизировать достаточно других вещей. Например, возможно, вы компилируете все свои Pattern объекты на лету, а не определяете их статически.

Кроме того, я думаю, что типичным примером является применение подсветки синтаксиса только тогда, когда пользователь делает паузу. Один из возможных способов реализации этого будет:

Шаг # 1: При каждом изменении текста (которое вы, вероятно, уже подключили), postDelayed() a Runnable и сохраняйте метку времени, полученную из SystemClock.uptimeMillis(), в элементе данных вашего подкласса EditText (или где-либо еще). у вас есть логика раскраски синтаксиса). Для целей этого ответа я буду называть ваш период задержки, который вы используете с postDelayed(), как DELAY.

Шаг # 2: Runnable сравнивает текущее время с SystemClock.uptimeMillis() со временем последнего изменения текста. Если разница во времени меньше, чем DELAY, вы знаете, что пользователь что-то набрал между тем, когда это Runnable было запланировано, и сейчас, так что вы просто ничего не делаете. Однако, если разница во времени> = DELAY, вы выполняете логику раскраски синтаксиса.

Таким образом, вы пропускаете применение раскраски синтаксиса до тех пор, пока пользователь не остановится, тем самым не прерывая его ввод. Вы можете настроить DELAY или, возможно, настроить его.

Кстати, вы планируете выпустить это как библиотеку с открытым исходным кодом, верно? : -)

...