一、OkHhtp的缓存策略
1.同步和异步的区别
里面有个Dispatcher这个类来实现,它主要作用是维护请求的状态(同步和异步),并且维护一个线程池,用于执行请求
同步请求
同步请求发送请求之后,就会进入阻塞状态,Dispatcher(分发器)主要做两个事情:保存同步请求、移除同步请求,直到收到响应。
异步请求
异步请求放到线程池里面,Dispatcher类主要做三件事情:正在执行异步队列、等待执行异步队列、维护一个还有一个线程池
里面之所以有两个异步请求队列:当前运行的异步队列小于64时候,它就会被放入到正在运行的异步队列(runningAsyncCalls)中,然后去运行线程池,否则就是加入就绪缓冲队列(readyAsyncCalls)当中作为等待
2.缓存的原理以及实现
2.缓存相关的知识
CacheInterceptor : 缓存拦截器
Expirse : 缓存失效的时间
Cactce-Contral : 控制缓存缓存类型
private : 客户端可以去缓存
public : 客户端和代理服务器都可以缓存
max-age : 表示多少秒后失效(在服务端用的较多)
no-cache : 通过服务验证码(304)是否能使用缓存
no-store : 代理和本地都不可以使用缓存,只能从服务器去拿数据
ETag : 通过返回的Response返回数据比较里面两个内容是否一直
If-None-Match : 与ETag成对存在的
Last-Modified : 最后一次修改时间(比如只是添加一个空格,时间就不一样,所以就出现ETag这个关键字段)
If-Modified-Since : 与Last-Modified成对存在的
二、Gilde内部大概原理、加载大图片以及产生OOM的解决办法
LRU的算法内部大概原理
内部使用LinkedHashMap作为缓存, get和put完成添加和获取的操作,HashMap的remove方法来移除对象,当内部缓存满的时候,会调用trimToSize方法把较早或者使用最少的缓存对象移除出去,添加新的对象。
三级缓存 : 网络->本地->内存
原理:第一次打开app时候,图片首先从网络获得,然后再本地和内存各缓存一份,再去请求相同的url的时候,就会去本地或者内存去找
图片产生OOM的原因
1.一个页面加载过多图片
2. 加载过大图片没有进行对图片尺寸、质量进行压缩
3.加载大量图片时候没有对图片做缓存
加载过大图片应如何处理
1.可以使用BitMapRegionDecoder
2.所以为了节约内存,在加载时可以设置Option.inSampleSize。但inSampleSize的取值只能是整数,不能精确缩放到指定尺寸。想要精确缩放,还需要结合inDensity(精度)、inTargetDensity使用