第三方框架的学习经验

一、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使用


 
原文地址:https://www.cnblogs.com/liunx1109/p/14413405.html