安卓开发 : Efficient Syntax Highlighting Tips?

标签 android performance syntax syntax-highlighting

我开发了自己的 Android 语法高亮库,效果很好,但问题是它会减慢输入速度。

我试过使用 AsyncTask 在后台执行正则表达式,然后应用必要的颜色,但它仍然减慢了输入过程。

目前,它读取整个 EditText,我想取而代之的是获取文本光标所在的行,获取该行 CharSequence 然后在该行而不是整个文档上执行正则表达式,但我真的不知道如何我可以获得用户正在处理的行 :(。

最佳答案

除非您只进行单行正则表达式/突出显示,否则您建议的策略可能行不通。例如,如果不扫描多行,您可能无法判断自己是否处于多行注释中。 :-)

如果您还没有这样做,请使用 Traceview 确定减速的具体位置。可能是你可以优化足够多的其他东西。例如,您可能正在动态编译所有 Pattern 对象,而不是静态定义它们。

除此之外,我认为典型的模式是仅在用户暂停时应用语法高亮显示。一种可能的实现方式是:

第 1 步:在每次文本更改时(您可能已经 Hook 了),postDelayed() 一个 Runnable 并保存从 SystemClock 检索的时间戳.uptimeMillis() 在你的 EditText 子类的数据成员中(或者任何你有语法着色逻辑的地方)。出于此答案的目的,我将您与 postDelayed() 一起使用的延迟时间称为 DELAY

第 2 步:Runnable 将来自 SystemClock.uptimeMillis() 的当前时间与上次文本更改的时间进行比较。如果时间差小于 DELAY,您就知道用户在安排此 Runnable 和现在之间键入了一些内容,因此您什么都不做。但是,如果时差 >= DELAY,您将运行语法着色逻辑。

这样,您可以跳过应用语法着色,直到用户暂停,从而不会打断他们的输入。您可以调整 DELAY,或者使其可配置。

顺便说一句,您计划将其作为开源库发布,对吧? :-)

关于安卓开发 : Efficient Syntax Highlighting Tips?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6794922/

相关文章:

mysql - 投影中属性的顺序是否会影响 SQL 查询的执行速度?

c++ - 代码膨胀何时开始对性能产生显着影响?

c++ - 什么样的数据结构适合facebook模型的用户

java - <?> 和 <?> 和 <?> 之间有什么区别? Java 泛型中的 extends Object> ?

android - IsCustomResponse 在基于适配器的身份验证中始终返回 false

android - Facebook 登录按钮在显示新 View 之前更改其在 'log out' 中的文本

c - 这是有效的 C 命令/指令吗?

c - VIM 语法 : conditional function coloring

android - Google Play控制台上的有效安装量急剧下降

android - 当互联网不存在时播放视频