iOS开发:webview动态添加配置返回、关闭按钮(简单又完美)

iOS开发:webview动态添加配置返回、关闭按钮(简单又完美),第1张

之前的想法是通过webview的navigationDelegate的各个生命周期中,判断webview的canGoBack属性,但是有不少缺陷:

比如单页应用的跳转不会触发生命周期,如果在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-工程创建&目录介绍


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11251288.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存