android - 从 SpannableStringBuilder 获取 SpannableString 的最佳方法

标签 android performance spannablestring

我正在一个类似 wiki 的解析器中工作,它为一组标记 token 创建跨度。它正在工作,但在 token 迭代器内,我经常需要将 SpannableStringBuilder 上的部分结果转换为 SpannableString。这被频繁调用,因此我正在寻找最有效的解决方案,并避免创建额外的对象。

目前我正在使用;

SpannableStringBuilder stuff=complex_routine_that_builds_it();
SpannableString result=SpannableString.valueOf(stuff);

然而,这个 valueOf 调用在内部从头开始构建一个 SpannableString 类型,执行 toString 和一个循环来复制分配的 span .

正如 SpannableStringBuilder 名称所暗示的那样,我认为也许有一种更快的方法可以从构建器获取 SpannableString 。这是真的吗?

最佳答案

当您可以像在 TextView 中一样直接使用 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);

但是您应该考虑为什么您甚至需要进行这种转换?只需使用原始的SpannableStringBuilder即可。

SpannableStringSpannableStringBuilder

这两者之间的区别类似于StringStringBuilder之间的区别。 String 是不可变的,但您可以更改 StringBuilder 中的文本。

同样,SpannableString 中的文本是不可变的,而 SpannableStringBuilder 中的文本是可变的。但值得注意的是,这仅适用于文本。它们的跨度(甚至是 SpannableString)都可以更改。

相关

关于android - 从 SpannableStringBuilder 获取 SpannableString 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23180107/

相关文章:

Android 隐藏和禁用通知(状态)栏

android - 如何在 Android 的 web View 中显示内置缩放控件

android - 从 EditText 获取 Spannable String

java - 如何设置可点击跨度的 ID?

java - Android Maps v2 上的自定义 Google Maps Engine map ?

c# - Convert.TryToInt64 而不是 Convert.ToInt64?

javascript - Switch语句: do you need the last break?(主要是Javascript)

Java ByteBuffer 性能问题

android - 如何将资源文件夹中的自定义字体设置为 Android 中操作栏的标题?

android - 使用 Android 云将图像发送到设备消息传递框架