Android: WebView 提高了本地 html 文件的加载速度

Android: WebView improve loading speed of local html Files

有没有办法提高将本地 .html 文件加载到 WebView 的速度。 .html 文件存储在 /assets 文件夹中。

正如您在视频中看到的(抱歉,link 已损坏!),TextView(红色背景)在转换开始前呈现, 而 WebView 中的文本显示在后面。我怎样才能像加载 TextView 一样快地加载 WebView

//current implementation
webView.setInitialScale(1);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.setScrollbarFadingEnabled(false);

webView.loadUrl("file:///android_asset/disclaimer.html");

摘要

这不可能。我在这里尝试了所有评论,但没有任何区别。

我问的原因是,我们申请了iOS和Android,主要是简单的TextViewsImages。所以我们有了创建 local html 文件的想法,我们可以在两个应用程序中使用这些文件。在 iOS 中,这就像一个魅力,但在 Android 中,我们无法摆脱加载时间,所以我总是有一个空白屏幕,100-200 毫秒后内容出现。

我想如果 Activity 可见,Androids WebView 开始渲染。这在 在线模式 中完全有意义,因为您不想加载多个 html 页面,用户在他真正关注之前会在后台新点击打开这些页面他们。然而,在离线模式(本地html文件存储在应用程序assets中)这种行为是不必要的,但你不能改变它。

现在我们终于明白为什么 phonegap & co 很烂了。

仅作记录: 最后,我使用了一个 activity 和一个空的 LinearLayout 容器,您可以在其中以编程方式插入内容。每种样式(标题 1、标题 2、内容...)都有自己的布局 xml 文件

public void insertHeadline(int id){

    String text = getString(id);
    TextView headline = (TextView) inflater.inflate(R.layout.layout_text_headline, null, false);
    headline.setText(text);

    //add this TextView to the empty container
    myLinearLayoutContainerView.addView(headline);

}

WebView 的渲染时间总是比原生 TextView 长。我认为这是平台的本质,但也许您可以尝试在加载屏幕之前将 html 内容读取到字符串(以避免文件系统操作中的 webview)。然后设置字符串:

webview.loadDataWithBaseURL("", earlyReadedHtmlString, "text/html", "UTF-8", "");

从理论上讲,这对于 webview 来说必须更快、更公平。另一种方法是等待 onPageFinished() 然后显示 textview。这可能是一种解决方法。

这取决于正在加载的 Web 应用程序。尝试以下一些方法:

设置更高的渲染优先级(从 API 18+ 开始弃用):

webview.getSettings().setRenderPriority(RenderPriority.HIGH);

Enable/disable硬件加速:

if (Build.VERSION.SDK_INT >= 19) {
// chromium, enable hardware acceleration
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
   // older android version, disable hardware acceleration
   webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

禁用缓存:

webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

Webview 的渲染速度永远无法与 textview 一样快(除非您真的在滥用 textview,例如加载数千行文本),无论您转动多少个开关 on/off 以及进行多少次优化和调整你尝试。呈现机制有利于 textview,因为它在如何指定对其正常呈现的更改方面受到更多限制,因为 webview 可以加载外部资源,因为 css 修改呈现,因为 javascript 可以影响呈现,因为它需要更多的内存和初始化来支持所有这些功能,...

这就是为什么 phonegap/cordova 应用程序永远无法像本机应用程序那样快速和交互的原因。好吧,除非本机应用程序仅由 webviews 组成:P

您仍然可以尝试通过修改其配置来改善 webview 的 load/render 时间,但您最好等到您的内容被定义。所有这些设置都允许在特定情况下进行改进,例如,更改图层类型可能有助于或缩短不同页面的渲染时间。正如 Nirmal 在他的回答中提到的那样,一些已知影响更大的是 layerType、cacheMode 和 renderPriority

我假设很难,您想要实现的是防止您的用户看到不完整的屏幕。您可以使用 onPageFinished 在显示屏幕之前渲染一个 webview,但它不会加载得更快,用户将不得不等待更长的时间直到屏幕转换,您可能需要一个旋转轮。

根据我的经验,您实现转换的方式是更好的用户体验,我会等到您定义了 html 内容后再尝试优化加载时间。

如果您已经发现当前的体验已经很烦人,我会考虑移除所有 html 内容/网络视图。

资产访问速度很慢,因为它们包含在 apk 文件中,而 apk 文件本质上是一个美化的 zip 文件。

我会编写一个启动例程,简单地从资产中获取文件并将它们写入内部存储(或外部存储,如果它们非常大且不包含敏感数据。

一旦您从 apk 的资产中提取它们,它们的访问速度就会快得多。