【发布时间】:2014-06-04 11:55:54
【问题描述】:
我正在使用一个类似于 wiki 的解析器,它为一组标记标记创建跨度。它正在工作,但在令牌迭代器中,我经常需要将SpannableStringBuilder 上的部分结果转换为SpannableString。这经常被调用,所以我追求最有效的解决方案,并避免创建额外的对象。
目前我正在使用;
SpannableStringBuilder stuff=complex_routine_that_builds_it();
SpannableString result=SpannableString.valueOf(stuff);
然而,这个 valueOf 调用在内部构建了一个 SpannableString 类型,从头开始,执行一个 toString 和一个循环来复制分配的 spans。
正如SpannableStringBuilder 的名字所暗示的那样,我认为也许有一种更快的方法可以从构建器那里获得SpannableString。是真的吗?
【问题讨论】:
-
如果你的文本中有一些跨度,你只需要 android.text.Spanned
-
是的,我现在明白了,
SpannableStringBuilder这个名字让我很困惑,我习惯使用StringBuffer,然后在最后得到一个String,并没有意识到SpannableStringBuilder还实现了Spanned、Charsequence等...构建器对我来说很方便,因为解析器对传入的字符串进行了大量操作以删除标记并创建许多不同的跨度:URL、颜色、大小...基本上我正在重写(非常)慢Html.fromHtml -
好主意,我不知道为什么,但这里 95% 的朋友使用 fromHtml,即使输入不是 html:他们先构建人工 html,然后调用 fromHtml,我找不到更愚蠢的东西
-
是的,如果您查看 Html.java 源代码,您只想死...它将字符串解析为 XML SaxParser (!),然后使用 100kb 库 Tagsoup 和无数常规检查格式正确的表达式、XML 模式和诸如此类的......仅支持粗体、斜体、标题和颜色,我用大约 150 行完成了这些,并且速度提高了 10 倍!
标签: android performance spannablestring