话说接触自定义线程池的时候还是几年前用Volley框架的时候,当时就注意到了一个东西叫队列,后来在实际开发中也没有用到相关的东西,只是写过简单的demo而已,现在各种框架很成熟,用多了就缺少了动手能力,所以我就简单了实现了这个框架。
整成思路是:默认创建了5个线程,通过LinkedBlockingQueue去管理线程执行请求,当没有任务时等待执行任务,当有任务来的时候就去执行线程,当任务超过时就排队等待。当在列表中去执行任务时,例如在listview中下载图片,为了防止图片错乱,我们用一个ConcurrentHashMap去维护,如果请求时的url和请求后的url是同一个url那么就是对的。并用LruCache去缓存图片。
以下是代码部分。
先看下downLoadImages这个方法,如果缓存中有对应得图片就直接设置,否则去下载。
为什么下载图片时要先 imageView.setImageBitmap(null);执行这句代码呢,由于listview的缓存机制,它会重用缓存的view导致view的图片还是之前缓存的,滑动时图片会覆盖产生一闪一闪的效果,体验很不好。
public class ImageLoderUtils implements HandlerCallbackImp{
private static final ImageLoderUtils mImageLoderUtils = new ImageLoderUtils();
private LruCache<String,Bitmap> mImageCache;
private ThreadManager mThreadManager;
private static final String TAG = "tag";
privateImageLoderUtils(){
mThreadManager = new ThreadManager(this);
mImageCache = mThreadManager.getImageCache();
}
public static ImageLoderUtils getInstance(){
return mImageLoderUtils;
}
public Bitmap getBitmapFromCache(String url){
if(url.isEmpty()){
return null;
}