Android WebView 在开发过程中有哪些坑
3个回答
展开全部
下面说说我比较困惑的几个地方。
1.WebViewClient.onPageFinished()。你永远无法确定当WebView调用这个方法的时候,网页内容是否真的加载完毕了。当前正在加载的网页产生跳转的时候这个方法可能会被多次调用,StackOverflow上有比较具体的解释(How to listen for a Webview finishing loading a URL in Android?), 但其中列举的解决方法并不完美。所以当你的WebView需要加载各种各样的网页并且需要在页面加载完成时采取一些操作的话,可能WebChromeClient.onProgressChanged()比WebViewClient.onPageFinished()都要靠谱一些。
2.WebView后台耗电问题。当你的程序调用了WebView加载网页,WebView会自己开启一些线程(?),如果你没有正确地将WebView销毁的话,这些残余的线程(?)会一直在后台运行,由此导致你的应用程序耗电量居高不下。对此我采用的处理方式比较偷懒,简单又粗暴(不建议),即在Activity.onDestroy()中直接调用System.exit(0),使得应用程序完全被移出虚拟机,这样就不会有任何问题了。
3.切换WebView闪屏问题。如果你需要在同一个ViewGroup中来回切换不同的WebView(包含了不同的网页内容)的话,你就会发现闪屏是不可避免的。这应该是Android硬件加速的Bug,如果关闭硬件加速这种情况会好很多,但无法获得很好的浏览体验,你会感觉网页滑动的时候一卡一卡的,不跟手。
4.数据积累问题。开启缓存什么的有利于网页的浏览体验,但你会发现即使是清除了必要的内容,比如Cache、Cookie、Form Data、History、Password等等东西,你的应用程序所占用的存储空间还是会越来越大,到最后只好手动到系统设置的应用信息界面里清除数据了 :(
5.滚动条问题。Android System WebView的横向滚动条真是好粗的有木有...
6.注意4.4系统前后的区别,在这个版本里面谷歌把webview的内核换成谷歌浏览器的!
7.在webview中进行JavaScript交互时也要注意,出于对安全性的考虑,在设置与JavaScript有关的选项时,需要在所在方法的前面加上@SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" }),不然4.2以上调用js会出现问题;
8.在调用loaddata方法时注意与loaddatawithurl的区别,前者要注意编码问题而且容易出于乱码问题,后者默认utf8编码!
另外针对Android System WebView的相关开发,推荐看看Google官方的示例教程 GoogleChrome/chromium-webview-samples · GitHub
1.WebViewClient.onPageFinished()。你永远无法确定当WebView调用这个方法的时候,网页内容是否真的加载完毕了。当前正在加载的网页产生跳转的时候这个方法可能会被多次调用,StackOverflow上有比较具体的解释(How to listen for a Webview finishing loading a URL in Android?), 但其中列举的解决方法并不完美。所以当你的WebView需要加载各种各样的网页并且需要在页面加载完成时采取一些操作的话,可能WebChromeClient.onProgressChanged()比WebViewClient.onPageFinished()都要靠谱一些。
2.WebView后台耗电问题。当你的程序调用了WebView加载网页,WebView会自己开启一些线程(?),如果你没有正确地将WebView销毁的话,这些残余的线程(?)会一直在后台运行,由此导致你的应用程序耗电量居高不下。对此我采用的处理方式比较偷懒,简单又粗暴(不建议),即在Activity.onDestroy()中直接调用System.exit(0),使得应用程序完全被移出虚拟机,这样就不会有任何问题了。
3.切换WebView闪屏问题。如果你需要在同一个ViewGroup中来回切换不同的WebView(包含了不同的网页内容)的话,你就会发现闪屏是不可避免的。这应该是Android硬件加速的Bug,如果关闭硬件加速这种情况会好很多,但无法获得很好的浏览体验,你会感觉网页滑动的时候一卡一卡的,不跟手。
4.数据积累问题。开启缓存什么的有利于网页的浏览体验,但你会发现即使是清除了必要的内容,比如Cache、Cookie、Form Data、History、Password等等东西,你的应用程序所占用的存储空间还是会越来越大,到最后只好手动到系统设置的应用信息界面里清除数据了 :(
5.滚动条问题。Android System WebView的横向滚动条真是好粗的有木有...
6.注意4.4系统前后的区别,在这个版本里面谷歌把webview的内核换成谷歌浏览器的!
7.在webview中进行JavaScript交互时也要注意,出于对安全性的考虑,在设置与JavaScript有关的选项时,需要在所在方法的前面加上@SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" }),不然4.2以上调用js会出现问题;
8.在调用loaddata方法时注意与loaddatawithurl的区别,前者要注意编码问题而且容易出于乱码问题,后者默认utf8编码!
另外针对Android System WebView的相关开发,推荐看看Google官方的示例教程 GoogleChrome/chromium-webview-samples · GitHub
展开全部
有时候自动跳转到默认游览器,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2017-05-02
展开全部
1. onPageFinished,进度条该结束的时候不结束,不该结束的时候提前结束,根本原因还是不同版本浏览器内核的实现差异导致的,也深入过内核代码发现确实结束的回调时机有差异,除非自己做内核,否则除了尽可能的兼容处理外, 尽量保证它提前结束,因为迟迟不结束比提前结束体验要糟糕得多。
2. webView耗电的问题,webView切换到后台时,如果当前页面有JS代码仍在不时的run, 就会导致比较严重的耗电,所以必须确保切换到后台后暂停JS执行,同时切回来的时候恢复它。
3. webView闪屏的问题,也是确实存在的,试验过,确实跟硬件渲染有关。
4. 数据积累也是头疼的问题,经常有用户抱怨它的空间被占满了,其实是webkit本身没有管理好缓存,不得不让浏览器开发人员涉法处理。
5.默认的webview滚动条确实很粗,但还是可以修改的。
2. webView耗电的问题,webView切换到后台时,如果当前页面有JS代码仍在不时的run, 就会导致比较严重的耗电,所以必须确保切换到后台后暂停JS执行,同时切回来的时候恢复它。
3. webView闪屏的问题,也是确实存在的,试验过,确实跟硬件渲染有关。
4. 数据积累也是头疼的问题,经常有用户抱怨它的空间被占满了,其实是webkit本身没有管理好缓存,不得不让浏览器开发人员涉法处理。
5.默认的webview滚动条确实很粗,但还是可以修改的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询