我正在开发一个遇到性能问题的 Android 应用程序。 我的目标是从 AsyncTask 接收字符串并将它们显示在 TextView 中。 TextView 最初是空的,每次其他进程发送一个字符串时,都会将它连接到 textview 的当前内容。 我目前使用 StringBuilder 来存储主字符串,每次收到新字符串时,我都会将其附加到 StringBuilder 并调用
myTextView.setText(myStringBuilder.toString())
问题是后台进程每秒最多可以发送100个字符串,我的方法效率不够。
每次都重绘整个 TextView 显然是个坏主意(时间复杂度 O(N²)),但我没有看到其他解决方案...
您是否知道 TextView 的替代方案可以在 O(N) 中完成这些连接?
最佳答案
只要字符串之间有一个换行符,您就可以使用 ListView 来附加字符串并将字符串本身保存在 ArrayList 或 LinkedList 中,当 AsyncTask 接收字符串时,您可以向其附加。
您也可以考虑简单地降低使 TextField 无效的频率;每秒说 10 次。这肯定会提高响应能力。像下面这样的东西可以工作:
static long lastTimeUpdated = 0;
if( receivedString.size() > 0 )
{
myStringBuilder.append( receivedString );
}
if( (System.currentTimeMillis() - lastTimeUpdated) > 100 )
{
myTextView.setText( myStringBuilder.getChars( 0, myStringBuilder.length() );
}
如果字符串突然出现——这样你的突发之间的延迟大于一秒——那么每次更新都会重置一个计时器,这将触发此代码再次运行以获取字符串的尾随部分最后一次爆发。
关于android - 如何有效地更新 Android textviews?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8556603/