比如单页应用的跳转不会触发生命周期,如果在didFinishNavigation中判断canGoBack,这要等页面加载完成才会执行,有很大的延迟.
下面是解决方案,其实很简单,就是通过kvo来监听canGoBack的变化:
根据微信的体验,微信的底部前进后退的状态判断也是根据监听canGoBack canGoForward来动态配置的
需要了解
1.WebView常见的一些坑
2.关于WebView的内存泄漏问题
----------------Web常见的一些坑-------------------
1.该漏洞源于程序没有正确限制使用WebView.addJavascriptlnterface方法,远程攻击者可以通过使用JavaReflectionApi利用该漏洞执行任意Java对象的方法
2.webView在布局文件中使用:webview写在其他容器中时
解决办法:需要销毁webView 在Ondestory方法里先把linelayout里的WebView.remove掉 然后再调用webView的removeAllviews和Destory方法 才能真正的将WebView销毁 从而不导致内存泄漏
3.webviewClient.onPageFinished(会判断网页内容是否真的加载完毕,如果当前正在加载的网页产生跳转,这个方法就会被调用无数次) --->所以调用:WebChromeClient.onProgressChanged
4.后台耗电
5.WebView硬件加速导致页面渲染的问题(容易出现页面加载白块 页面闪烁)
解决办法:设置WebView暂时关闭硬件加速
-----------------关于WebView的内存泄漏问题-----------------
1.为什么会造成内存泄漏?
因为WebView首先会关联Activity而内部执行的 *** 作会在新的线程当中.Activity的生命周期和新线程的生命周期是不一样的所以说导致了WebView他会一直持有activity的对象引用不能回收、
2.如何避免内存泄漏?
方法一:开启独立进程给WebView进行 *** 作 (会牵扯到近程通信比较麻烦)
方法二:动态添加WebView (我们要对传入WebView的Context进行弱引用 在Activity停止时remove掉)\
开发过程中通常使用方法一 因为 1>这个webview使用完毕后直接杀死进程防止内存泄漏
2>我们App的主进程减少了内存容量
背景:原生时间紧没时间开发任务量大的任务,而前端又闲着打酱油
方案:原生+webview混合开发
缺点:对于比较复杂的页面,webview在性能上力不从心;且与原生通信频繁也增加了隐藏的工作量
优点:能自带支持动态更新(js),能充分利用人力
webview是一个基于webkit引擎,展示web页面的控件。Android上的webview在低版本和高版本采用了不同的webkit版本内核,Android4.4(19)后直接使用了Chrome内核;WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求,页面加载,渲染,页面交互进行强大的处理。一般来说webview可单独使用,也可联合其工具类一起使用
移动应用的主体是webview,主要以网页语言编写,穿插Native功能的Hybrid App开发类型。激活webview为活跃状态,能正常执行网页的响应;当webview 的页面被失去焦点切换到后台不可见状态onPause时,需要通知自己暂停所有的动作,比如DOM的解析,plugin的执行,JavaScript的执行等
1,显示和渲染web页面
2,直接使用本地assets或者网络上的html文件作为布局
3,可和JavaScript进行互相调用
1,直接在布局文件里写死
2,动态添加进viewgroup中
注:不管以哪种方式,都必须注意webview的销毁,否则可能会造成内存泄漏最终导致内存溢出crash
下面是WebView的一些常用的方法列举,一些已经过时的方法未列出
下面是WebSettings的一些常用的方法列举,一些已经过时的方法就没有写出来了
一般不管是动态生成还是xml写死,只要处理好了引用持有问题,就能有效的避免内存泄漏;下面是我尝试的方案,在工具类WebViewUtils.java里封装好,在activity销毁的时候调用
1,清除webview缓存和记录
2,可以设置不启用缓存
3,H5的一些控件标签不支持导致的白屏
4,xml启用软件加速
5,通过menifest的来配置,在目标webview的activity设置
解决方案:
解决方案:
解决方案:
上一篇: Flutter入门-01-工程创建&目录介绍
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)