前言
总所周知,主流应用都有瀑布流下拉图片的页面,为了使页面更丝滑,通常需要对图片进行缓存。这种通用需求,对标竞品往往使用三方库来实现,比如安卓有Glide 、Picasso、ImageLoader。IOS有SDWebImage,Kingfisher,PINRemoteImage。当前鸿蒙应用开发,主要推荐使用@ohos/imageknife.
然而@ohos/imageknife 2.x版本主要网络下载图片和解析的逻辑虽然是使用异步promise的方式,原则上不阻塞主线程。但是,当在页面快速下滑时,由于有很多的图片同时请求和加载,还是会造成主线程整体执行时间过长,导致页面出现丢帧卡顿。
为了解决这个问题,我逐步开始分析@ohos/imageknife和glide的源码,决定对@ohos/imageknife做一次彻底的重构,也就是当前的3.x版本。根据目前从仿抖音应用测试快速下拉图片的页面测试数据来看,丢帧率已经从原来6%+,下降几乎为0%。于是乎,总结了下从3.x–>2.x主要的优化手段,相信这些方式不仅对三方库法,对应用开发也会有很大的借鉴意义。
1.把主要的逻辑移植到子线程里。
自API11以后,鸿蒙应用提供了TaskPool的能力(https://docs.openharmony.cn/page … ool-introduction.md),因此我把图片加载的主要逻辑:网络下载+文件