InkBoard图片缓存方案
一、为什么需要做图片缓存?
1)慢(获取缩略图慢、生成二维码慢、切页慢等),缓存的数量有限,如果没有生成就去获取还是慢,墨水屏上使用bitmap.compress(format, CACHE_PNG_IMAGE_QUALITY, jpgOutputStream)生成一张1404*1872的图片大概3s
2)统一管理,避免重复生成图片
二、缓存方案
获取图片的方式:
1)获取某个页面的bitmap,该bitmap不带背景,是一张绘制了元素的透明bitmap;
2)获取某个页面图片的本地文件绝对路径,该路径的图片文件是带背景的。
为什么获取方式是这样的?
1)切换页面时需要透明的图片,否则无法切换背景;
2)因为内存问题不再内存缓存一份带背景的bitmap,统一通过文件绝对路径提供屏幕大小的图片。
流程图:
图1缓存方式:
1)在切换页面的时候触发缓存页面(可以设置当前页前后n页进行缓存,每次切页当前页不做缓存)
2)不使用LruCache方式,因为那样控制不了哪一页该被释放,也就无法缓存自己希望的页面bitmap
需要解决的问题:
1)避免频繁创建bitmap引起频繁GC
1、不再使用的Bitmap不要recycle,使用软引用保留起来下次使用
2、通过Option的inBitmap复用
3、Bitmap一定要是可变的,即inMutable设置一定为ture
4、Android2.3以及更低的版本不能使用Bitmap复用的方式
5、Android3.0以上Android4.4以下的平台,须要保证inBitmap和即将要得到decode的Bitmap的尺寸规格一致
6、Android4.4及其以上的平台,仅仅须要满足inBitmap的尺寸大于要decode得到的Bitmap的尺寸规格就可以
7、使用bitmap复用时如果涉及到透明图片要用png格式图片
谷歌文档:https://developer.android.com/topic/performance/graphics/manage-memory.html#kotlin
图2