Android中webview使用的一些坑

Android中webview使用的一些坑,第1张

概述前言在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者简单的展示一些在线内容等。

前言

在AndroID开发中,经常会使用WebVIEw来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者简单的展示一些在线内容等。

WebVIEw可以很好地帮助我们展示HTML页面,但是webvIEw使用不当的话还是可能产生一定问题的,下面就以下几个方面说说我的优化技巧

1、展示webvIEw的activity可以另开一个进程,这样就能和我们app的主进程分开了,即使webvIEw产生了oom崩溃等问题也不会影响到主程序,如何实现呢,其实很简单,在androIDmanifest.xml的activity标签里加上androID:process="packagename.web"就可以了。运行起来就会发现多了一个进程,哈哈。

2、webvIEw的创建也是有技巧的,最好不要在layout.xml中使用webvIEw,可以通过一个vIEwgroup容器,使用代码动态往容器里addvIEw(webvIEw) ,这样可以在onDestory()里销毁掉webvIEw及时清理内存,另外需要注意创建webvIEw需要使用applicationContext而不是activity的context,销毁时不再占有activity对象,这个大家应该都知道了,最后离开的时候需要及时销毁webvIEw,onDestory()中应该先从vIEwgroup中remove掉webvIEw,再调用webvIEw.removeAllVIEws();webvIEw.destory();

创建

ll = new linearLayout(getApplicationContext()); ll.setorIEntation(linearLayout.VERTICAL); wv = new WebVIEw(getApplicationContext()); 

销毁

@OverrIDe rotected voID onDestroy() {  ll.removeAllVIEws();  wv.stopLoading();  wv.removeAllVIEws();  wv.destroy();  wv = null;  ll = null;  super.onDestroy(); 

3、进一步的优化,activity被动被杀之后,最好能够保存webvIEw状态,这样用户下次打开时就看到之前的状态了,嗯,就这么干,webvIEw支持saveState(bundle)restoreState(bundle)方法,所以就简单了,哈哈,看看代码吧:

保存状态:

@OverrIDe protected voID onSaveInstanceState(Bundle outState) {  super.onSaveInstanceState(outState);  wv.saveState(outState);  Log.e(TAG,"save state..."); } 

恢复状态:

在activity的onCreate(bundle savedInstanceState)里,这么吊用:

if(null!=savedInstanceState){  wv.restoreState(savedInstanceState);  Log.i(TAG,"restore state"); }else{  wv.loadUrl("http://3g.cn"); } 

再总结几个坑

WebVIEwClIEnt.onPageFinished() 。你永远无法确定当WebVIEw调用这个方法的时候,网页内容是否真的加载完毕了。当前正在加载的网页产生跳转的时候这个方法可能会被多次调用,StackOverflow上有比较具体的解释(How to Listen for a WebvIEw finishing loading a URL in AndroID?), 但其中列举的@R_403_6120@并不完美。所以当你的WebVIEw需要加载各种各样的网页并且需要在页面加载完成时采取一些 *** 作的话,可能WebChromeClIEnt.onProgressChanged()WebVIEwClIEnt.onPageFinished()都要靠谱一些。

WebVIEw后台耗电问题。当你的程序调用了WebVIEw加载网页,WebVIEw会自己开启一些线程(?),如果你没有正确地将WebVIEw销毁的话,这些残余的线程(?)会一直在后台运行,由此导致你的应用程序耗电量居高不下。对此我采用的处理方式比较偷懒,简单又粗暴(不建议),即在Activity.onDestroy()中直接调用System.exit(0) ,使得应用程序完全被移出虚拟机,这样就不会有任何问题了。

切换WebVIEw闪屏问题。如果你需要在同一个VIEwGroup中来回切换不同的WebVIEw(包含了不同的网页内容)的话,你就会发现闪屏是不可避免的。这应该是AndroID硬件加速的BUG,如果关闭硬件加速这种情况会好很多,但无法获得很好的浏览体验,你会感觉网页滑动的时候一卡一卡的,不跟手。

数据积累问题。开启缓存什么的有利于网页的浏览体验,但你会发现即使是清除了必要的内容,比如Cache、cookie、Form Data、History、Password等等东西,你的应用程序所占用的存储空间还是会越来越大,到最后只好手动到系统设置的应用信息界面里清除数据了 :(

滚动条问题。AndroID System WebVIEw的横向滚动条真是好粗的有木有...

在某些手机上,WebvIEw有视频时,activity销毁后,视频资源没有被销毁,甚至还能听到在后台播放。即便是像刚才那样各种销毁webvIEw也无济于事,解决办法:在onDestory之前修改url为空地址。是不是很坑?

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。

您可能感兴趣的文章:Android WebView使用的技巧与一些坑Android WebView那些坑之上传文件示例Android中WebView的基本配置与填坑记录大全 总结

以上是内存溢出为你收集整理的Android中webview使用的一些坑全部内容,希望文章能够帮你解决Android中webview使用的一些坑所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1142712.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存