Anroid面试专题(十二):图片大小的优化 及 三级缓存
面试官:“你在项目中处理过图片吗,说一下你是如何对它做优化的,及三级缓存是什么?”
我们可以这样一步一步来回答:
1.一张图的大小是怎么计算的
要回答这个问题,我们要先从图片说起,从图片的像素说起:
如图,我们可以看到一张像拼图似的图片,这里面最小的那个小方格,就相当于我们说的一个像素。
那为什么我们在看图片的时候看不到那一个一个的小方格呢?
这是因为我们图片的像素特别的多,特别的小。
我们再来说一下 如何计算 一张图片的大小:
图片的大小 = 一个像素点的大小 × 像素的总个数
2.优化一张图的方法
我们知道了图片的大小是怎么计算的,那对于优化图片,我们不难想到2个思路:
-
①减小每个像素的大小
-
②减小像素的总个数
Android其实给我们提供了2个参数进行优化图片:
它们就是BitmapFactory.Options当中的
-
inPreferredConfig
设置图片解码后的像素格式,如ARGB_8888/RGB_565
那 ARGB_8888/RGB_565表示的又是什么意思呢?
ARGB_8888表示:
A(透明度) 要占用8位,
R 要占用8位,
G 要占用8位,
B 要占用8位,
这样组成一个像素的话,就是加在一起32位—也就占用4个字节。
而GRB_565一个像素占用5+6+5=16位=2字节。
所以如果我把之前图片由ARGB_8888 变成 RGB_565,则图片大小就变为原来的1/2了
-
inSampleSize
设置图片的采样率进行图片的缩放显示。注意它的值必须为2的幂(即:2,4,8…)
比如值为2,则加载图片的宽高是原来的 1/2,整个图片所占内存的大小就是原图的 1/4
3.做缓存与不做缓存的区别
-
图片不做缓存,如左图:加载第一张图片时,在堆内存中开辟一块空间,当第1张图片不用了,加载第二张时,它又会在堆里面开辟新的空间,而不会复用之前的空间,即每次加载图片都开辟新的空间,容易出现oom.
-
图片做缓存,如右图:加载第一张图片时,在堆内存中开辟一块空间,当第1张图片不用了,加载第2张时,它会先去比较,如果当前图片的大小<=堆内存已有的空间,就去复用之前的空间,而不用去开辟新的空间。
4.三级缓存的原理:
就是当 App需要引用缓存时,首先到内存缓存中读取,读取不到再到本地缓存中读取,还获取不到就到网络异步读取,读取成功之后再缓存到内存和本地中。
积累点滴,学一点是一点~