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,主要是简单的TextViews
和Images
。所以我们有了创建 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 的资产中提取它们,它们的访问速度就会快得多。
有没有办法提高将本地 .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,主要是简单的TextViews
和Images
。所以我们有了创建 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 的资产中提取它们,它们的访问速度就会快得多。