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

你可能感兴趣的:(InkBoard图片缓存方案)