一,webView的常见的一些坑;
二,关于webView的内存泄露问题;
一,webView之前的坑
1,API16以及之前的版本存在着远程代码执行安全漏洞。该漏洞源于程序没有正确使用webView.addJavascriptInterface方法,远程攻击者可以通过使用Java Reflection API利用该漏洞执行任意java对象的方法。(即利用反射机制攻击其他为注册的java类)
2,webView在布局文件中的使用:webView写在其他的容器中时:
利用addView动态将webView添加入容器中,
当销毁时,要在onDestory()方法中把webView销毁,然后才能真正地销毁整个webView。
具体销毁的步骤:
先把容器中的webView调用remove方法移除,即到onDestory()方法中调用webView的removeAllViews();,和webView的destory方法;
转载:以下是Android避免WebView内存泄漏的方法
原文:https://blog.csdn.net/weixin_34323858/article/details/88157190
@Override
protected void onDestroy() {
super.onDestroy();
if (mWebView != null) {
//加载null内容
mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
//清除历史记录
mWebView.clearHistory();
//移除WebView
((ViewGroup) mWebView.getParent()).removeView(mWebView);
//销毁VebView
mWebView.destroy();
//WebView置为null
mWebView = null;
}
}
收藏:webview内存泄漏终极解决方案
https://www.jianshu.com/p/aa5a99b565e7
该博文介绍了关于webview内存泄漏的一些方法,其中讲到,上面的方法其实没有太多作用,因此她采用了:
1,另起一个进程加载webview,页面销毁后干掉这个进程。(用于webview业务逻辑间没有交互的情况),但另起一个进程,要占用CPU时间,主进程需要等待接受信息,那么势必会慢一些。
2,文中还利用了一些实例进行介绍。
webview的一些相关的知识和问题
1,jsbridge:让本地的navi端可调用远端的js代码,可以远端web调用本地的navi
2,webViewClient.onPageFinished - > webChromeClient.onProgressChanged
前一个方法是加载完成回调时:用于判断是否加载,若加载中跳转,则会调用无数次
后一个方法则时加载多次,且有操作,靠谱。
3,后台耗电:
webView自己开线程,残余线程留着,耗电居高不下,在Activity的onDestory()方法中直接调用System.exit()方法,可以销毁掉webView,且直接关虚拟机
4,webView硬件加速导致页面渲染问题
安卓3.0开始硬件加速,容易出现界面闪烁,页面白块,可以通过设置webView展示关闭硬件加速来解决问题。
三,关于webView内存泄漏问题
1,解决webView内存泄漏的问题的方法:
开启独立进程,简单粗暴,不过可能会涉及到进程间的通信。
问题的描述:
1,webView关联Activity
=> 2,内部
=> 3,在新线程中,时间无法确定 。导致webView不能一直持有Activity的引用,因此没有办 法回收。
原因:Activity的生命周期和新线程webView的生命周期不一样。
原理:
匿名内部类持有外部类的引用,导致外部类无法回收。
关键词: 独立进程,进程间通信
2,动态添加webView,对传入webview中使用的Context使用弱引用,动态添加webView,意思是在布局创建webGroup用来放置webView,Activity创建时add进来,在activity停止(即销毁)时,remove掉。
网友评论