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


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

正如你在视频中看到的那样(对不起,链接坏了!TextView (红色beackground)在转换开始之前呈现,而文本在 WebView 之后显示。我怎样才能实现加载 WebView 和TextView一样快?

//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应用程序,主要由简单组成 TextViews 和 Images。所以我们有了创造的想法 本地  html 我们可以在两个应用程序中使用的文件。在 iOS 这就像一个魅力,但在 Android 我们无法摆脱加载时间,所以我总是有一个空白的屏幕,在100-200ms后出现内容。

我想机器人 WebView 如果活动可见,则开始渲染。这完全有道理 在线模式,因为你不想加载几个html页面,用户在实际关注它们之前,在后台的新点击中打开这些页面。但是,在 离线模式 (存储在应用程序中的本地html文件 assets)这种行为是不必要的,但你无法改变它。

现在我们现在真的为什么phonegap&co糟透了。

仅供记录: 最后,我使用了一个空的活动 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);

}

12652
2018-04-12 14:50


起源



答案:


无论您打开/关闭多少个开关以及尝试进行多少次优化和调整,webview都无法像文本视图一样快速地呈现(除非您真的滥用文本视图,例如加载数千行文本)。渲染机制有利于textview,因为它更加局限于如何指定对其正常表示的更改,因为webview可以加载外部资源,因为css修改表示,因为javascript可以影响表示,因为它需要更多的内存和初始化来支持所有这些功能,......

这就是为什么phonegap / cordova应用程序不能像本机应用程序一样快速和交互式的原因。好吧,除非原生应用程序仅由webviews构成:P

您仍然可以通过修改配置来尝试改进webview的加载/渲染时间,但最好等到内容定义完毕。所有这些设置,允许在特定情况下进行改进,例如,更改图层类型可能会帮助或恶化您的不同页面的渲染时间。正如Nirmal在他的回答中提到的,一些已知具有更大影响的是layerType,cacheMode和renderPriority

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

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

如果你已经发现当前的经历已经令人烦恼,我会考虑把所有的html内容/网页带出来。


3
2018-04-22 02:33





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

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

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

启用/禁用硬件加速:

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);

5
2018-04-21 11:55





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

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

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


4
2018-04-15 09:02





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

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

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


2
2018-04-22 08:33



您能否发布如何在其他地方复制资产? - shurrok


答案:


无论您打开/关闭多少个开关以及尝试进行多少次优化和调整,webview都无法像文本视图一样快速地呈现(除非您真的滥用文本视图,例如加载数千行文本)。渲染机制有利于textview,因为它更加局限于如何指定对其正常表示的更改,因为webview可以加载外部资源,因为css修改表示,因为javascript可以影响表示,因为它需要更多的内存和初始化来支持所有这些功能,......

这就是为什么phonegap / cordova应用程序不能像本机应用程序一样快速和交互式的原因。好吧,除非原生应用程序仅由webviews构成:P

您仍然可以通过修改配置来尝试改进webview的加载/渲染时间,但最好等到内容定义完毕。所有这些设置,允许在特定情况下进行改进,例如,更改图层类型可能会帮助或恶化您的不同页面的渲染时间。正如Nirmal在他的回答中提到的,一些已知具有更大影响的是layerType,cacheMode和renderPriority

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

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

如果你已经发现当前的经历已经令人烦恼,我会考虑把所有的html内容/网页带出来。


3
2018-04-22 02:33





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

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

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

启用/禁用硬件加速:

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);

5
2018-04-21 11:55





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

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

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


4
2018-04-15 09:02





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

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

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


2
2018-04-22 08:33



您能否发布如何在其他地方复制资产? - shurrok