27

运行我的应用程序会导致我的手机使用约 40% 的 CPU:

final String position = String.format("%02d:%02d:%02d", time.getHours(), time.getMinutes(),
                time.getSeconds());
getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {
         c.mTxtPosition.setText(position);
         ...

通过注释掉setText方法,CPU 使用率下降到预期的 ~4% 水平。该方法每秒调用一次,并且会刷新 ImageViews、CustomViews ...,而不会导致相同的负载过剩。除了 CPU 使用率之外,dalvik 仅通过调用setText()就不断报告大约 10-1000 个对象的垃圾收集。

像这样创建一个跟踪文件:

Debug.startMethodTracing("setText");
c.mTxtPosition.setText(position);
Debug.stopMethodTracing();

traceview 将以下方法按各自的独占 CPU% 列为 Top 5:

  • ViewParent.invalidateChildInParent(16%)
  • View.requestLayout(11%)
  • ViewGroup.invalidateChild(9%)
  • TextView.setText(7%)
  • 顶层(6%)

有人对此有解释吗?

4

5 回答 5

22

前段时间我自己也注意到了,我认为问题是每次调用 setText 时,文本框的大小都会发生变化,因此需要整个屏幕进行重新布局(昂贵)。

我自己还没有尝试过,但是如果您的文本框很简单并且可以设置为相对固定的大小,则可以尝试将 TextView 子类化并创建一个不会在 setText 上调整自身大小的视图,而只是绘制它可以绘制的任何内容进入现有区域?那会节省很多时间。

也许 setText 已经有一个标志可以使它做到这一点,但我不知道,尽管我没有仔细搜索。

于 2012-05-29T19:13:56.157 回答
3

就我而言,我从触摸事件更新了一个 TextView,这会导致大量更新解决方案是将 TextView 的 layout_width 和 layout_height 更改为固定大小。

于 2014-05-22T05:52:01.113 回答
1

一些可能的改进:

  1. 尝试使用每 0.5 秒更新一次文本视图的处理程序,而不是执行它的线程。
  2. 使可运行对象成为最终的常量对象,而不是每秒创建一个新对象。
  3. 考虑在告诉 textview 更新自身之前检查时间是否已更改(newTimeInMs-LastPublishedTimeInMs>=1000)。
  4. 而不是 String.format ,尝试使用 StringBuilder 。但是,您不会喜欢 String.format 提供的语言环境解决方案(例如,对于阿拉伯数字)。
于 2012-05-29T19:24:45.937 回答
0

就我而言,这是 TextView 的这个属性:

android:ellipsize="marquee"

删除它可以加快设置文本的速度。

于 2016-01-16T13:23:42.367 回答
0

如果你查看setText方法的源代码,你会发现它做了很多繁重的工作——测量、绘图和对象分配,所有这些都在主线程上运行。

您可以使用新的PrecomputedTextAPI 以在后台线程上完成所有这些操作并setText加快速度。

您可以使用kotlin&使用以下工作示例coroutines

private fun TextView.setTextAsync(text: String) {
    val textView = this
    lifecycleScope.launch {
        val params = TextViewCompat.getTextMetricsParams(textView)
        val precomputedText = withContext(Dispatchers.Default) {
            PrecomputedTextCompat.create(text, params)
        }
        TextViewCompat.setPrecomputedText(textView, precomputedText)
    }
}

有关更多详细信息,您可以在我的博客 https://androidexplained.github.io/android/ui/2020/10/21/improving-textview-settext-performance.html上阅读有关它的文章

于 2020-10-25T20:07:38.750 回答