在我的某个应用中,我必须显示服务条款,这是一种巨大的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
,除了将字符串拆分为多个部分并执行延迟加载之外,有什么办法可以避免这种延迟?
答案 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>