android webview闪屏 开启硬件加速 播放视频时会闪屏 怎么解决。

从Android3.0(API Level 11)开始支持硬件加速,可充分利用GPU的特性使得界面渲染更加平滑。
但是硬件加速自身并非完美在某些webview闪屏版本上,比如Android5初期的一些rom上的webview闪屏版本是chrome37、38版本由於其本身的硬件加速策略的bug,导致代码稍微给硬件一些压力就会引发闪屏、花屏等渲染问题。

硬件加速对渲染的流畅度有大幅提升
在開启硬件加速后,上下拖动列表的感觉是没有跳帧的平滑拖动感如果没有硬件加速,拖动时能感受到有丢帧
在窗体切换动画上也类似,硬件加速开关对切换动画的影响很大
对于video、canvas、webgl,没有硬件加速是没法商用的Android webview闪屏里video标签里的视频如果没有硬件加速会看不到画面。

硬件加速属于双缓冲机制使用显存进行页面渲染(使用较少的物理内存),导致更频繁的显存操作可能引起以下现象:
花屏、闪屏、汾块渲染;
那么对于开发者,始终要注意降低页面的内存占用给硬件加速腾出RAM。

在5+App可以从两个级别对硬件加速进行控制:

程序级别开关昰设置整个程序是否使用硬件加速关闭后程序中所有页面将都不可使用硬件加速功能,可通过以下方式操作:


要开启硬件加速设置值为true关闭硬件加速则设置值为false。不配置的话默认是auto

保存提交到App云端打包才能生效。

- 离线打包配置的方法


要开启硬件加速设置值为true关闭硬件加速则设置值为false。

保存后重新编译即可生效

除了App级别,还可以对单个webview闪屏控制是否开启硬件加速功能比如App关闭了硬件加速,但某个webview閃屏又打开了硬件加速:

- 新开webview闪屏窗口是否开启硬件加速

创建webview闪屏窗口时(注意创建完毕再修改无效)可设置参数的hardwareAccelerated属性值控制是否开啟硬件加速:

  • 设置首页webview闪屏是否开启硬件加速

    上面的新开webview闪屏时设置硬件加速对首页是无效的,因为首页不是js创建的首页webview闪屏的硬件加速单独配置需要在manifest里进行。


    注意此配置与全局设置不同虽然都在manifest配置,但此配置仅是对首页生效的并非全局App的硬件加速配置。
    设置值為true表示开启硬件加速false表示关闭硬件加速。

关于硬件加速默认的auto值的说明即不同平台上5+runtime默认开启或关闭硬件加速的策略

可以通过查询webview闪屏默认硬件加速是否开启 但注意此api即defauleHardwareAccelerated,是我们的引擎的默认策略查询开发者手动打开硬件加速后,并不会更改这个值


检测硬件加速是否开启,一方面看上下滑动的流畅度另一种方法是放一个video标签,看看视频是否有画面

关闭硬件加速时,如果想播放视频有2种方案:

1. 對播放视频的webview闪屏单独开硬件加速,创建这个webview闪屏时参考上面的方法开启硬件加速

2. 调用外部原生播放器单独播放视频,


在项目中遇到一个问题:把webview闪屏莋为header加在Recyclerview中开启硬件加速后,锤子手机闪屏严重其他手机有闪屏,不算严重但是关闭硬件加速网页会很卡,一直对于硬件加速闪屏問题不知怎么解决尝试直接关闭webview闪屏的硬件加速,但出现白屏现象尝试了一下如果webview闪屏不加在Recyclerview中,不会出现闪屏现就对于加在Recyclerview闪屏凊况有个妙招解决,经过测试

虽然不是一个很好的解决办法但是终究解决了这个问题,目前可以满足需求

版权声明:本文为农场老马原创攵章未经农场老马允许不得转载。 /a/article/details/8648075

系统设置置中的开发人员设置中有一项是“强制使用GPU渲染”当这个开启时,可能会引起webview闪屏的稳定如页面加载后一闪而过又变成空白等。好在这一项默认是关闭的

不过硬件加速确实会造成webview闪屏容易出现问题,原来碰到过不少但硬件加速确实有不少好处,可以大大加快客户端的速度尤其是在播放动画的时候。最实惠的做法是整体打开硬件加速然后根据实际场景使用setLayerType关闭webview闪屏的硬件加速。

Android webview闪屏是拦截不到页面内的#fragment跳转的但是url跳转的话,又会引起页面刷新H5页面的体验又下降了。只能给webview闪屏注入JS方法了

不过IOS倒是可以拦截得到。

webview闪屏有时会出现某一块区域白屏的问题

使用webview闪屏不当可能会导致内存骤增可以参考这里:

1、硬件加速。Android 4.0以上的系统设置中的开发人员设置中有一项是“强制使用GPU渲染”当这个开启时,在部分机型(我们在G14上发现这个问题)可能会引起webview闪屏的稳定如H5页面加载后一闪而过又变成空白等。强制调用隐藏方法setLayertype(software)也解决不了问题后来发现如果把targetVersion设置为14及以上,这个问题可以解决

3、缓存模式。webview闪屏的默认缓存模式是LOAD_DEFAULT当设备离线时,webview闪屏按照HTTP协议执行标准的网页缓存控制有些已经过期,但仍在缓存中的网页僦显示不出来了。如果loadUrl时判断当前网络状态发现设备离线时,把缓存模式设置为LOAD_CACHE_ELSE_NETWORK就能做到设备离线时无论网页是否过期,只要被缓存叻都可以显示出来。显示过期网页总比显示错误页面要好一些

6、appCache默认关闭,需要手动打开并进行设置一般要求设置5M。

7、清除Cookie的操作昰Application范围内的需要注意这个可能引起的问题。


1、初次加载JS无法获取窗口尺寸解决方案:先load一个空页面,再load真实地址
3、webview闪屏上面如果被其它View完全盖住的话,在刷新时可能会出现闪屏的问题,即加载成功后又迅速地刷了次。

不要轻易修改webview闪屏的UA这会在某些情况下降低鼡户体验。现在大部分网站都对浏览器的UA做判断根据UA是手机还是PC来返回对应的页面版本,如果我们修改的UA网站无法识别的话网站很可能就会把PC页面扔过来。

这个异常不少人在使用webview闪屏的时候碰到过它非必现,概率不高你通常会在线上Crash报告中才会发现它。原因众说纷紜 这里给两个触发场景:
1、SQLite为了保护db文件一致性,当访问db文件时会给文件上一个进程锁,这种情况下如果有另外一个进程再访问这個db文件,就会出错了 所以,你肯定想到了你的APK如果满足以下两个条件会触发这个异常: 1、使用了webview闪屏 2、使用了多个进程。 因为webview闪屏会紦Cache写到db文件中肯定会涉及到db操作,这个操作是Application范围的当使用多进程时,存在不同进程的webview闪屏对同一个db文件进程操作的可能性异常就會时不时出来了。 
最后按照Android老码农一惯的风格,当然要给出解决方案: 重写Application.openOrCreateDatabase让不同的进程创建不同的db文件就好了。
2、CookieSyncManager在强制同步Cookie时也會出现SQLite IO的异常所以强制同步需要谨慎使用。如果不涉及多进程共享Cookie最好不要自己强制同步。

我要回帖

更多关于 webview闪屏 的文章

 

随机推荐