lon*_*ngi 11 html performance android android-assets android-webview
有没有办法提高加载本地.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");
Run Code Online (Sandbox Code Playgroud)
摘要
这是不可能的.我在这里尝试了所有评论并没有什么区别.
我问的原因是,我们有iOS和Android的应用程序,主要包括简单TextViews
和Images
.所以我们有了创建本地 html
文件的想法,我们可以在两个应用程序中使用它们.在iOS
这个作品就像一个魅力,但在Android
我们无法摆脱加载时间,所以我总是有一个空白的屏幕,并在100-200ms之后出现内容.
我想WebView
如果活动可见,Androids会开始渲染.这在在线模式下完全有意义,因为您不想加载几个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);
}
Run Code Online (Sandbox Code Playgroud)
这取决于正在加载的Web应用程序.尝试以下一些方法:
设置更高的渲染优先级(不推荐使用API 18+):
webview.getSettings().setRenderPriority(RenderPriority.HIGH);
Run Code Online (Sandbox Code Playgroud)
启用/禁用硬件加速:
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);
}
Run Code Online (Sandbox Code Playgroud)
禁用缓存:
webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
Run Code Online (Sandbox Code Playgroud)
WebView 的渲染时间总是比原生 TextView 更长。我认为这是平台的性质,但也许您可以尝试在加载屏幕之前将 html 内容读取为字符串(以避免文件系统操作中的 webview)。然后设置字符串:
webview.loadDataWithBaseURL("", earlyReadedHtmlString, "text/html", "UTF-8", "");
Run Code Online (Sandbox Code Playgroud)
从理论上讲,这对于 webview 来说必须更快更公平。另一种方法是等待 onPageFinished() 然后显示 textview。它可以是一种解决方法。
无论您打开/关闭多少个开关以及尝试多少次优化和调整,WebView 的渲染速度都无法像 TextView 一样快(除非您确实滥用 TextView,例如加载数千行文本)。渲染机制有利于textview,因为它在如何指定对其正常呈现的更改方面受到更多限制,因为webview可以加载外部资源,因为css修改呈现,因为javascript可以影响呈现,因为它需要更多内存和初始化来支持所有这些功能,...
这就是为什么phonegap/cordova应用程序永远无法像本机应用程序那样灵活和交互的原因。好吧,除非本机应用程序仅由 webviews 组成:P
您仍然可以尝试通过修改 webview 的配置来改善 webview 的加载/渲染时间,但最好等到您的内容被定义。所有这些设置都允许在特定情况下进行改进,例如,更改图层类型可能会帮助或缩短不同页面的渲染时间。正如 Nirmal 在他的回答中提到的,已知影响较大的一些是 LayerType、cacheMode 和 renderPriority
我认为很难,您想要实现的目标是防止用户看到不完整的屏幕。您可以使用 onPageFinished 在显示屏幕之前渲染 webview,但它不会加载得更快,用户将不得不等待更长的时间,直到屏幕转换,并且您可能需要一个旋转轮。
根据我的经验,实现转换的方式可以带来更好的用户体验,我会等到定义 html 内容后再尝试优化加载时间。
如果您已经发现当前的体验已经令人恼火,我会考虑删除所有 html 内容/网络视图。
归档时间: |
|
查看次数: |
6368 次 |
最近记录: |