webView相关总结
webView开发常见的一些坑
-
Android API level 16以及之前的版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用WebView.addJavascriptInterface方法,远程攻击者可以通过使用java 反射利用该漏洞执行任意java对象的方法
-
webview在布局文件中使用:webview写在其他容器中
比如webview写在LinearLayout中里面,然后通过addView方法动态添加webview,需要注意的是,当你离开的时候需要销毁webview,这时候你在onDestroy方法里面,一定要先把LinearLayout里面的webview给remove掉,然后再调用webview的removeAllViews和webview的destroy方法。才能真正的销毁整个webview,而不会导致内存泄漏问题 -
jsbridge
通过javascript构建几个桥,桥的一端是web端,一端是客户端native;
搭建桥的目的是为了让本地的native端可以调用远端的js代码,同时也可以让远端的js代码调用本地native代码; -
webviewClient.onPageFisihed -> WebChromeClient.onProgressChanged
onPageFisihed页面加载完成时会回调这个方法,但是这个方法有很多坑;
它会判断你这网页加载是否真的完毕了,而当前正在加载的网页,如果产生跳转的时候,这个方法就会被调用无数次。
所以说当你的webview需要加载各种各样的网页时,并且需要在网页上完成一些操作的时候,最好还是调用WebChromeClient.onProgressChanged
这个方法。 -
后台耗电
当你的程序加载webview开启网页时,webview会去自己开启一个线程,如果没有将webview很好的销毁,这些残余的线程就会一直在后台运行。而导致应用程序的耗电量居高不下。
由于耗电问题是非常严重的性能问题,采取在Activity的onDestroy方法中直接调用System.exit
方法,直接把虚拟机关闭,也不会有任何的webview问题,但这种处理方式比较粗暴,可以结合实际情况来处理; -
webview硬件加速导致页面渲染问题
硬件加速是从android3.0开始的,当开启硬件加速后,webview页面拖动起来会更加顺滑,但是这里容易出现页面加载白屏以及页面闪烁的现象。解决这个问题最好的办法就是暂时关闭webview的硬件加速;
webView可能造成的内存泄漏问题
webview为什么会造成内存泄漏
首先webview要关联一个Activity,而且webview内存执行的操作是在新的线程当中,执行的时间Activity是没有办法确定的。Activity的生命周期和新线程的生命周期是不同步的,所以会导致webview一直持有Activity的引用,不能回收造成内存泄露;
和匿名内部类持有外部类的引用导致外部类无法回收的原理是一样的;
为了避免内存泄漏,有两种做法:
-
独立进程
开启一个单独的进程给webview操作,不过会涉及到进程间通信,比较麻烦; -
动态添加webView
对传入的webview中使用的Context使用弱引用。
动态添加webview的意思是在布局文件中创建ViewGroup用来放置webview,Activity创建时add进来,在Activity停止时remove掉;
开发中使用较多的还是第一种:
首先webview使用完毕后直接干掉这个进程,
二是app的主进程减少了一些内存容量