最近做项目被WebView卡得头皮发麻,用户刷着刷着就卡成PPT,后台投诉直接爆了。今天就跟大伙儿唠唠我是咋把这个坑填上的,步骤全掏出来晾晾!
第一步:先给WebView整个预加载
以前傻乎乎等用户点了才初始化WebView,结果启动慢得跟老牛拉破车似的。现在直接在App启动时暗搓搓搞事:
- 提前new个WebView实例:趁用户没注意,在后台偷偷new好塞到内存里
- 空页面先load着:给它喂个空白html,相当于提前烧热发动机
实测点开页面直接从3秒缩到0.5秒,连产品经理都跑来问是不是偷偷加了进度条特效。
第二步:缓存给我往死里榨
眼睁睁看着用户每次刷新都重新下资源,流量不要钱是?直接上手改WebSettings:
- setCacheMode整到LOAD_CACHE_ELSE_NETWORK:能扒拉本地缓存绝不联网
- Database和DomStorage全开:这俩货默认关着,手动捅开开关
改完立马见效果——二次加载速度直接起飞,原来2.6MB的页面现在80%走本地缓存
第三步:独立进程的巨坑
看网上说独立进程能防内存泄露,结果掉坑里摔个狗吃屎:
- 兴冲冲在manifest里塞了android:process=":webview"
- 刚启动美滋滋,内存确实降了200MB
- 关页面时傻眼了:进程赖在后台不走,开三个页面吃掉1.2G内存!
只能手动写onDestroy()里怼*(0),跟杀毒似的强制清进程。同事笑我说这操作比拔电源还暴力。
第四步:和渲染死磕到底
滚动时跟卡成狗,气得我直接抓狂:
- setLayerType(LAYER_TYPE_HARDWARE):硬渲染拉满
- setOffscreenPreloadExtra(3):多准备几屏备用
- 在WebChromeClient里死盯onProgressChanged:进度到85%再亮页面
现在用户手指怎么划拉都丝滑,跟吃了德芙似的
的大招:硬件加速
偶然发现个神操作:在Activity里抡起setHardwareAccelerated(true)。刚开始还嘀咕会不会崩,结果试了之后:
- 页面闪白时间砍掉2/3
- 视频播放卡顿次数从每分钟7次降到0次
测试组老大拍桌子喊“早特么该这么搞了”,我蹲墙角默默把文档里“不建议开启”那行字给划了。
折腾完这些活生生把FPS从41干到58,内存泄漏次数从日均23次干到0次。现在看用户刷H5页面那顺溜劲儿,跟搓自己写的原生页面似的。不过说真的,WebView这玩意就跟自家熊孩子一样——三天不打上房揭瓦,得拿棍子天天盯着!
