我已经为Android开发了自己的语法高亮库,它运行良好,但问题是它减慢了输入速度。
我尝试使用AsyncTask在后台执行正则表达式,然后应用necassary颜色,但它仍然减慢了打字过程。
目前,它读取整个EditText,我想到的是获取文本光标所在的行,获取该行CharSequence然后在该行上执行正则表达式而不是整个文档,但我真的不知道如何我可以得到用户正在处理的行:(。
答案 0 :(得分:4)
除非您只进行单行正则表达式/突出显示,否则您提出的策略可能无效。例如,如果没有扫描多行,你可能无法判断你是否处于多行注释中。 : - )
如果您还没有这样做,请使用Traceview来确定减速的具体位置。可能你可以优化足够的其他东西。例如,您可能正在动态编译所有Pattern
个对象,而不是静态定义它们。
除此之外,我认为典型的模式是仅在用户暂停时应用语法突出显示。实现这一目标的一种可能方式是:
步骤1:在每次文字更改(您可能已经加入)时,postDelayed()
一个Runnable
并将SystemClock.uptimeMillis()
中检索到的时间戳保存在EditText
的数据成员中{1}}子类(或者您拥有语法着色逻辑的任何地方)。出于本答案的目的,我将使用postDelayed()
作为DELAY
来表示您使用的延迟期。
步骤2:Runnable
将SystemClock.uptimeMillis()
的当前时间与上次文本更改的时间进行比较。如果时差小于DELAY
,您就会知道用户在安排此Runnable
之后输入了一些内容,现在就不做任何操作。但是,如果时差> gt {= DELAY
,则会运行语法着色逻辑。
这样,您可以跳过应用语法着色,直到用户暂停,从而不会中断他们的输入。您可以调整DELAY
,也可以将其设置为可配置。