基本原理
AndroidVideoCache 通过代理的策略实现一个中间层将我们的网络请求转移到本地实现的代理服务器上,这样我们真正请求的数据就会被代理拿到,这样代理一边向本地写入数据,一边根据我们需
要的数据看是读网络数据还是读本地缓存数据再提供给我们,真正做到了数据的复用。
使用:
(1)把自己的真实网络url替换成另一个url(2)可自定义文件名, 大小, 文件个数,缓存采取的是LruCache的方法,对于老文件在达到上限后会
自动清理。
实现:
(1)127.0.0.1,这个就是localhost的ip也就是本地ip,创建了一个 ServerSocket ,随机分配了一个端口,这里通过 getLocalPort 拿到了这个服务器端口,后面用来通信
(2)先构建一个全局的一个本地代理服务器 ServerSocket,指定一个随机端口,然后新开一个线程,
在线程的 run 方法里,通过accept() 方法监听这个服务器socket的入站连接,accept() 方法会一
直阻塞,直到有一个客户端尝试建立连接。
(3)获取url
- 如果本地已经缓存了, 那么直接换成本地url, 然后touch一下文件,把时间更新后最新,因为后
面LruCache是根据文件被访问的时间进行排序的
- 如果本地没有缓存, 那么先判断当前的url是不是本地url. 这里拼接出来一个带有127.0.0.1目
标地址及端口并携带原url的新地址,这个请求的话就会被我们的服务器socket监听到.
(4)整个socket会被包裹成一个runnable,发配给线程池。
(5)代理服务器在处理socket的时候, 利用getClients 就是一个ConcurrentHashMap,重复url返回
的是同一个HttpProxyCacheServerClients ,如果是第一次就会根据url构建出一个
HttpProxyCacheServerClients并被put到ConcurrentHashMap中,真正的操作都在这个客户端的
processRequest 操作中,并且传递过去一个是request(这是一个GetRequest 对象,是一个url和
rangeoffset以及partial的包装类)另一个就是客户端socket。
(6)get完之后就进行process
这里将生成一个HttpProxyCache ,
并开启HttpURLConnection来获取一个InputStream,这样才能通过这个输入流读数据,同时也创建
了一个本地的临时文件,一个以.download结尾的临时文件.
同时注册一个CacheListener
(7)HttpProxyCache 的处理过程:
在while循环里面,开启了一个新的线程sourceReaderThread,其中封装了一个
SourceReaderRunnable的Runnable,这个异步线程用来给cache,也就是本地文件写数据,同时还更
新一下当前的缓存进度
同时我们的另一个线程也会从cache中去读数据,在缓存结束后同样也会发送一个通知通知自己已经
缓存完了