1、WebView常见的一些坑
1.1Android API 16以及之前的版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用WebView.addJavascriptInterface方法,远程攻击装可以通过使用Java Reflection API利用该漏洞执行任意Java对象的方法
1.2webView在布局文件中的使用,webView写在其他容器中时
动态添加webview,对传入webview中使用的Context使用弱引用,动态添加webview意思在布局创建个viewGroup用来放置webview,Activity创建时add进来,在Activity停止时remove掉。否则你在webview调用destory时,webview仍绑定在Activity上,容易引起内存泄露。因此需要先从父容器中移除webview,然后再销毁webview:
rootLayout.removeView(webView);
webView.destroy();
1.3jsbride
通过jsbride可以实现H5和native层方法互调
1.4webviewClient.onPageFinished->webChromeClieent.onProgressChanged
onPageFinished:页面加载完成的时候会回调这个方法,但是这个方法有缺陷如果当前正在加载的网页产生跳转的时候这个方法可能会被多次调用。所以需要尽量避免在onPageFinished()中做业务操作,否则会导致重复调用,还有可能会引起逻辑上的错误。所以建议使用onProgressChanged
1.5后台耗电
当你的程序调用了WebView加载网页,WebView会自己开启一些线程,如果你没有正确地将WebView销毁的话,这些残余的线程。会一直在后台运行,由此导致你的应用程序耗电量居高不下。对此我采用的处理方式比较偷懒,简单又粗暴(不建议),即在Activity.onDestroy()中直接调用System.exit(0),使得应用程序完全被移出虚拟机,这样就不会有任何问题了
1.6webview硬件加速导致页面渲染问题
webview开启硬件加速之后,页面的滑动会更加顺畅。但是也有一个问题易出现页面加载白块和页面闪烁的现象。解决方法就是关闭硬件加速。
1.7数据积累问题
开启缓存什么的有利于网页的浏览体验,但你会发现即使是清除了必要的内容,比如Cache、Cookie、Form Data、History、Password等等东西,你的应用程序所占用的存储空间还是会越来越大,到最后只好手动到系统设置的应用信息界面里清除数据了
2、关于WebView内存泄露问题
泄露原因:WebView会关联一个Activity,而WebView内部执行的操作是在一个新的线程当中。执行时间其实Activity是没有办法确定的,Activity的生命周期和这个新线程的生命周期是不一样的。所以就导致了这个WebView会一直持有这个Activity的引用,不能回收。
2.1独立进程,简单暴力,不过可能涉及到进程间通信
<android:name=".WebviewActivity"
android:process=":h5"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize|keyboardHidden"
/>
每个独立的进程都能分配独立的内存,这样的话,你的app可以获得双倍的内存,其中一半给Webview吃。增大Webview获得的内存,变相的减小内存泄露产生OOM的概率。
在适当时机直接杀掉Webview独立进程,什么内存泄露,内存占用巨大的问题都见鬼去吧。要问什么时机?比如退出app时,检测到没有Webview页面时。
Webview发生崩溃时不会导致app闪退,因为Webview是在独立进程中,如果发生崩溃,主进程还安然无事,app还在运行中,没有闪退。
2.2动态添加webview,对传入webview中使用的Context使用弱引用,动态添加webview意思在布局创建个viewGroup用来放置webview,Activity创建时add进来,在Activity停止时remove掉