在TextView上设置文本时,花太多时间才能在屏幕上显示文本

时间:2018-07-18 22:02:28

标签: android kotlin textview

我将文本视图上的文本设置为14,000,000个字符长的字符串。

这需要1到5分钟的时间才能加载到屏幕上(取决于设备)。有什么想法可以加快速度吗?

以下是相关代码:

  responseView.text = requestResponsePair.second
 .....................
  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    tools:context="com.salesrabbit.android.sales.universal.features.lumberjack.TextDisplayFragment">

 <TextView
     android:id="@+id/request_label"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@string/request_label_string"
     android:textSize="20sp"/>

 <TextView
     android:id="@+id/text_view_request"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"/>

 <TextView
     android:id="@+id/response_label"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@string/response_label_string"
     android:textSize="20sp"/>

 <TextView
     android:id="@+id/text_view_response"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"/>

  </LinearLayout>

3 个答案:

答案 0 :(得分:3)

一种方法

最近,Google宣布PrecomputedText适用于SDK级别28及更高版本。随之而来的PrecomputedTextCompat已发布,可用于SDK 21到27。我还没有尝试过,但是Chris Craik中有一篇名为“ Prefetch Text Layout in RecyclerView”的中篇文章,解释了如何利用它以及在不丢失任何框架的情况下从UI线程中释放出多少工作量。

文章摘录

预计算

var item = (from highPrice in listProduct
            orderby highPrice.ProductPrice descending
            select highPrice).FirstOrDefault();

将预先计算的文本设置为TextView

val precomputedText : Spannable = PrecomputedTextCompat.create(expensiveText, params)

请务必阅读文档,因为需要向后台线程发布一些内容。

方法二

将您的文本分成小块或小段。将其放入列表中,并使用简单的RecyclerView显示列表中的每个项目。这很简单,您将获得免费的良好性能,因为RecyclerView会渲染和处理用户可见的项目。

此外,请确保收听Episode 90: Spanspanspanspan播客中的Android Developers Backstage,该播客由Android工程团队的开发人员托管。

答案 1 :(得分:1)

使用预计算文本

在这里使用PrecomputedText是最好的方法之一。通过an answer阅读Giorgos Neokleous

关闭连字符

关闭断字功能也有助于显着提高性能。您可以通过为特定的TextView设置android:hyphenationFrequency="none"或为整个应用程序覆盖该属性来做到这一点:

<!-- res/values/styles.xml -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- ... -->
    <item name="android:textViewStyle">@style/AppTextView</item>
</style>

<style name="AppTextView" parent="BaseAppTextView">
    <item name="android:hyphenationFrequency">none</item>
</style>

<style name="BaseAppTextView" parent="android:Widget.TextView"/>


<!-- res/values-21/styles.xml -->
<style name="BaseAppTextView" parent="android:Widget.Material.TextView"/>

还请看几个链接:

答案 2 :(得分:0)

该文本太长。您应该将它们除以\ n(分成几段),然后将每个段落放入recyclerview的textview中。

折衷方案是用户无法选择所有文本或段落之间,但我相信最后它将是一个更好的用户体验。

然后您应该应用预计算文本。