上一章节和本章节没有非常紧密的联系,本章节主要正对我上传的demo(demo下载地址:http://download.csdn.net/detail/fei810711peng/9651974)理顺一下思路,只要根据这个思路去理解事半功倍(如果出现事倍功半,建议看其他人的~肯定属于我描述能力问题)。
程序目录如下:
没有创建太多的类,所以总体来说比较清晰(里面的东西还是很有调理的)
思路整理:
首先是基础的比较基础:mainactivity中一个activity_main布局,并且加载适配器new ImageAdapter。
第一步、初始化ImageCache
主要初始化变量,初始化myLruCache,mySoftCache,同时打开磁盘缓存
还有初始化等待队列(等待图片加载),加载队列(正在加载图片队列),图片空间管理。
第二步、加载图片
manager.loadImages(viewHolder.imageView, url, false);
1.首先从LruCache和SoftReference中查找,如果找到返回bitmap(并且将图片位置移到最前面),然后通过imageview控件加载出来;找不到返回null。
2.如果找不到,AsyncTask异步处理,正在下载的异步请求存放在一个队列中,为了防止死锁以及提高线程性能,设置了最大线程并发量(即最多只允许8个线程同时运作),如果超出,则存放到等待队列中,只有正在加载队列里面的个数小于最大并发量才允许调用等待队列中的异步请求。
3.AsyncTask异步请求中,首先到磁盘中去查找是否有对应的信息(磁盘有日志记录),如果有直接从磁盘缓存中获取,否则第三级,从网络上获取,并且保存到磁盘和LruCache中,然后控件加载图片,最后移除本次正在加载的AsyncTask,启动等待队列中的AsyncTask。
以上描述结束,很多细的地方说不完,需要自己去体会,只可意会不可言传。
demo下载地址再次说明下:
http://download.csdn.net/detail/fei810711peng/9651974