在 TextView 中设置长文本将挂起 ui 线程(更具体地说,在 Android 的 nComputeLineBreaks() 调用中)

MLe*_*Lec 9 android kotlin

我需要在 TextView 中设置一个非常长的字符串(一个边缘情况),该字符串仅在一行中。用户案例是这样的:用户必须能够选择整个字符串以将其复制到剪贴板(如果设备的剪贴板允许)。问题是:每当字符串变得超大时,UI 就会开始挂起。它是渐进的,我的意思是,在 13,000 个字符时,它会很好。在 65000 个字符时,UI 加载时间约为 156 秒。

通过运行分析器,我看到大部分“繁重的工作”都是在这种方法nComputeLineBreaks()中完成的,它本质上是一种计算段落换行符数量的本地方法。分析器运行的图片,只是为了显示调用堆栈。 这是用大约 65k 长字符的文本赢得的

我的代码中也没有太多内容,我只是在做textview.text = text.

尝试过的可能解决方案:

  1. 我看到了谷歌从 API 28 提供的这个新 API,它(有点)与 API 21 兼容。我指的是PrecomputeText,我试图按照这个官方 android 博客来尝试提高性能,但这是徒劳的

  2. 我试图在协程中创建一个新的 textview 以允许它计算它需要的内容,然后删除我以前的视图并附加新的视图。仍然造成严重滞后

  3. 我确实设置了一个maxLines希望它会减少换行符的计算,但它失败了

另外,这里有一些相关的帖子,我发现对我的情况没有多大帮助:

从本质上讲,根据我收集的信息, setText 调用是罪魁祸首。不幸的是,这意味着操纵 UI,据我所知,这只能在主线程上实现,这会导致丢帧。

任何想法都非常受欢迎!