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
protected 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");
}

再总结几个坑

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

安卓webview的一些坑相关推荐

  1. 安卓WebView的那些坑

    1.手机以及电脑浏览器均能打开,而WebView打开该网址却不显示任何东西 项目中,要显示一个URL详情,其实就是使用WebView来打开一个URL而已啦!本来都好好的,某一天,测试的过程发现该Web ...

  2. 安卓webview下使用zepto的swipe遇到的坑

    众所周知,安卓手机上touch事件一直有各种各样莫名其妙的问题. 比如,我想要用swipeLeft/swipeRight监听向左向右滑动事件,如果只是单纯为元素增加swipeLeft/swipeRig ...

  3. android webview缺点,Android的WebView有哪些坑?

    今天逛知乎的时候,看到一个有关 WebView 的坑很多,主要的比较让人疑惑的坑有如下几个: 1.WebViewClient.onPageFinished().你永远无法确定当WebView调用这个方 ...

  4. 在react-native中使用crosswalk webview内核来增强安卓webview体验流畅性

    在react-native中使用crosswalk webview内核来增强安卓webview体验流畅性 最近使用react-native开发安卓app,由于我们要在webview中运行白鹭引擎开发的 ...

  5. 安卓webview显示网页字体模糊的问题

    问题 先看下如下代码 <div id='A'>绝对定位区域</div> <div id='B'>内容正文区域</div> #A{position: ab ...

  6. 安卓源码避坑指南3——拨打电话的SIM卡无效导致蓝牙断开连接

    安卓源码避坑指南3--拨打电话的SIM卡无效导致蓝牙断连 它来了.它来了,它带着BUG赶来了,欢迎大家查看本期的安卓源码避坑指南.本期的问题场景比较特殊,电话SIM卡是无效的(欠费过期了,很是贫穷-) ...

  7. 安卓webview中键盘遮挡输入框如何解决

    关键词:安卓原生.unity.webview.键盘遮挡输入框.沉浸式状态栏. 首先是最简单的情况,当我们app有一个比较靠下的输入框时,唤出键盘会遮挡住输入框. 这种情况的对应方式很简单,只需要找到安 ...

  8. Android webView 的一个坑,字体怎么突然变小了

    搜索发现 Web 网页的代码适配单位是 rem,有点类似于 dp. Web 网页在适配分辨率的时候,通常会设置 viewport 属性 于是我尝试在代码里面加了这样的代码,发现 SignatureWe ...

  9. 安卓Webview缓存网页数据(无网络正常显示)

    热度 1已有 52 次阅读2016-8-26 17:53 |个人分类:常见问题|系统分类:移动开发 一.需求经历 最近的项目是一个原生 +webview 显示的 APP,一开始的时候,网站那边要求我们 ...

最新文章

  1. python 判断debug
  2. POJ 3264: Balanced Lineup
  3. MySQL数据类型(最大值 和 最小值)
  4. 8、网友问答之串口数据接收与数据强制转换---------labview宝典
  5. linux 网络通信框架,Linux下 C++ HPSocket通信框架的简单使用
  6. 杏仁粉的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  7. wxpython 显示mdi界面_wxPython中Icon, MDI, HtmlWindow使用示例
  8. Exception: ROM is missing for ms_pacman, see https://github.com/openai/atari-py#roms for instruction
  9. 多伦多大学计算机专音乐专业,多伦多大学音乐理论专业介绍
  10. linux 缩小硬盘镜像,缩小qcow2格式kvm虚拟镜像磁盘大小[转]
  11. 询问HTG:Android版本,同时的耳机和扬声器声音以及iPad文件加载
  12. Core Animation学习笔记—第二节Setting up Layer Objects
  13. 【历史上的今天】9 月 5 日:Scala 之父出生;华为发布麒麟 980 芯片;计算机存储器的革命
  14. uCLinux系统分析
  15. Linux 误删文件恢复命令及方法!
  16. vps怎么做文件服务器,vps搭建文件服务器
  17. 词嵌入 word embedding
  18. 【Spring】IOC,你真的懂了吗?
  19. JavaScript中如何正确的获取字符串长度
  20. lattice的HNP问题学习

热门文章

  1. 常用的SQL语句大全
  2. Muli3D 2 matMatrix44RotationQuaternion 函数 (四元数转矩阵)
  3. performance性能
  4. queue.queue是什么
  5. linux pci/pcie驱动
  6. 仿热血江湖帮战客方血帮战 开始对战记时器结束事件
  7. 定制 CFileDialog 的相关 ID
  8. register_chrdev_region、alloc_chrdev_region、register_chrdev区别
  9. UML---工厂模式
  10. linux卡利系统设置密码,Kail Linux2019.04更新:新增“卧底模式” 模拟Win10界面