显示大字符串时如何避免滞后?

时间:2015-06-30 13:05:54

标签: android textview

在我的某个应用中,我必须显示服务条款,这是一种巨大的HTML格式String。在String中显示此TextView会导致中高端设备(Nexus 5,SGS 4)明显滞后,并在低端设备上冻结最多4秒。

我设法通过简单的任务将帧丢弃减少了大约60%,以便将HTML解析从主Thread移开:

public class FromHTMLTask extends AsyncTask<String, Void, Spanned> {

private OnHTMLParseCompleteListener listener;

public FromHTMLTask(OnHTMLParseCompleteListener listener) {
    this.listener = listener;
}

public interface OnHTMLParseCompleteListener {
    void onHtmlParsed(Spanned text);
}

@Override
protected Spanned doInBackground(String... params) {
    return Html.fromHtml(params[0]);
}

@Override
protected void onPostExecute(Spanned result) {
    super.onPostExecute(result);
    if (listener != null)
        listener.onHtmlParsed(result);
 }
}

但是,setText()方法本身在显示已处理的文本时会导致明显的延迟,而Choreographer仍会报告低端设备上有35个丢帧。

由于我无法从后台setText()拨打Thread,除了将字符串拆分为多个部分并执行延迟加载之外,有什么办法可以避免这种延迟

2 个答案:

答案 0 :(得分:2)

TextView was not designed to show large texts. I suppose WebView should work much faster especially if you need to show html.

WebView webView;
String html;
webView.loadDataWithBaseURL("", html, "text/html", "UTF-8", "");

答案 1 :(得分:0)

如果您坚持使用 TextView ,可以将其放在 NestedScrollView 内以获得更好的性能。

   <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
     >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/details"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@string/about"
              />
        </LinearLayout>
    </androidx.core.widget.NestedScrollView>