Android 从SpannableStringBuilder处获得SpannableStrings的最佳方式
我在一个类似wiki的解析器中工作,该解析器为一组标记创建范围。它正在工作,但在令牌迭代器中,我经常需要将Android 从SpannableStringBuilder处获得SpannableStrings的最佳方式,android,performance,spannablestring,Android,Performance,Spannablestring,我在一个类似wiki的解析器中工作,该解析器为一组标记创建范围。它正在工作,但在令牌迭代器中,我经常需要将SpannableStringBuilder上的部分结果转换为SpannableString。这是一个非常频繁的调用,所以我在寻找最有效的解决方案,避免创建额外的对象 目前我正在使用 SpannableStringBuilder stuff=complex_routine_that_builds_it(); SpannableString result=SpannableString.val
SpannableStringBuilder
上的部分结果转换为SpannableString
。这是一个非常频繁的调用,所以我在寻找最有效的解决方案,避免创建额外的对象
目前我正在使用
SpannableStringBuilder stuff=complex_routine_that_builds_it();
SpannableString result=SpannableString.valueOf(stuff);
然而,这个valueOf
调用内部构建了一个SpannableString
类的从头开始,执行toString
和一个循环来复制分配的span
正如
SpannableStringBuilder
name所暗示的,我认为也许有一种更快的方法可以从构建器获取SpannableString
。这是真的吗?当您可以直接使用文本视图时,无需将SpannableStringBuilder
转换为SpannableString
:
SpannableStringBuilder stuff = complex_routine_that_builds_it();
textView.setText(stuff);
正如问题已经表明的那样,如果你必须这样做的话,你可以进行转换
SpannableStringBuilder stuff = complex_routine_that_builds_it();
SpannableString result = SpannableString.valueOf(stuff);
<> P>但是你应该考虑一下为什么你需要转换?只需使用原始的SpannableStringBuilder
vs
这两者之间的区别类似于String
和StringBuilder
之间的区别。String
是不可变的,但是您可以在StringBuilder
中更改文本
类似地,SpannableString
中的文本是不可变的,而SpannableStringBuilder
中的文本是可变的。但需要注意的是,这只适用于文本。它们两个上的跨距(即使是SpannableString
)都可以更改
相关的
如果你的文本中有一些span,那么你需要的就是android.text.span。我现在明白了,名称SpannableStringBuilder
让我很困惑,我习惯于使用StringBuffer
然后在最后得到一个String
,并且没有意识到SpannableStringBuilder
也实现了span
,Charsequence
,等等。。。生成器对我来说很方便,因为解析器对传入的字符串执行大量操作,以删除标记并创建许多不同的跨度:URL、颜色、大小等等。。。基本上,我正在重写(非常)慢的Html。fromHtml
好主意,我不知道为什么,但这里95%的同伴使用fromHtml,即使输入不是Html:他们首先构建人工Html,然后调用fromHtml,我找不到比这更愚蠢的东西了,如果你看一下Html.java源代码,你就会想死。。。它将字符串解析成一个XML SaxParser(!),然后使用一个100kb的库Tagsoop,其中包含无数正则表达式,用于检查格式是否良好、XML模式等。。。。只支持粗体、斜体、标题和颜色,我用了大约150行,速度快了10倍!