Android中webview使用的一些坑

 更新时间:2018年05月04日 10:33:24   作者:古月先生  
这篇文章主要给大家介绍了关于Android中webview使用的一些坑,通过一下总结的这些内容,对大家学习或者使用webview具有一定的参考学习价值,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

前言

在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?), 但其中列举的解决方法并不完美。所以当你的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中的线程封装

    浅析android中的线程封装

    下面我就简单的说一下android对线程的c++封装。需要的朋友可以过来参考下。希望对大家有所帮助
    2013-09-09
  • Android开发之数据的存储方式详解

    Android开发之数据的存储方式详解

    本篇文章主要介绍了Android开发之数据的存储方式,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
    2016-11-11
  • Android adb安装apk时提示Invalid APK file的问题

    Android adb安装apk时提示Invalid APK file的问题

    这篇文章主要介绍了Android adb安装apk时提示Invalid APK file的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Android 接收微信、QQ其他应用打开第三方分享功能

    Android 接收微信、QQ其他应用打开第三方分享功能

    这篇文章主要介绍了Android 接收微信、QQ其他应用打开,第三方分享 ,思路很简单通过在AndroidManifest.xml注册ACTION事件,在用于接收分享的Activity里面加接收代码,感兴趣的朋友可以一起学习下
    2022-11-11
  • 详解Flutter桌面应用如何进行多分辨率适配

    详解Flutter桌面应用如何进行多分辨率适配

    这篇文章主要为大家介绍了Flutter桌面应用如何进行多分辨率适配的方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Flutter适配深色模式的方法(DarkMode)

    Flutter适配深色模式的方法(DarkMode)

    这篇文章主要介绍了Flutter适配深色模式的方法(DarkMode),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Android自定义ScrollView实现放大回弹效果

    Android自定义ScrollView实现放大回弹效果

    这篇文章主要为大家详细介绍了Android自定义ScrollView实现放大回弹效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Android双击返回键退出程序的实现方法

    Android双击返回键退出程序的实现方法

    这篇文章主要介绍了Android双击返回键退出程序的实现方法,是Android程序开发中非常具有实用价值的重要技巧,需要的朋友可以参考下
    2014-09-09
  • android RecyclerView的一些优化点介绍

    android RecyclerView的一些优化点介绍

    大家好,本篇文章主要讲的是android RecyclerView的一些优化点介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Flutter自动路由插件auto_route使用详解

    Flutter自动路由插件auto_route使用详解

    这篇文章主要为大家介绍了Flutter自动路由插件auto_route的基本使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论