版权声明:本文为博主原创文章,未经博主允许不得转载。
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.util.LruCache;
importandroid.widget.ImageView;
importjava.io.IOException;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
/**
*CreatedbyAdministratoron2016/3/1.
*/
publicclassImageLoader{
publicImageLoader(){
}
//图片缓存类
ImageCacheimageCache=newImageCache();
//线程池,线城数量为cpu的数量
ExecutorServicemExecutorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
/**
*显示图片
*@paramurl图片的url
*@paramimageView要显示的view
*/
publicvoiddisplayImage(finalStringurl,finalImageViewimageView){
Bitmapbitmap=imageCache.get(url);
if(bitmap!=null){
imageView.setImageBitmap(bitmap);
return;
}
imageView.setTag(url);
mExecutorService.submit(newRunnable(){
@Override
publicvoidrun(){
Bitmapbitmap=downloadImage(url);
if(bitmap==null){
return;
}
if(imageView.getTag().equals(url)){
imageView.setImageBitmap(bitmap);
}
imageCache.put(url,bitmap);
}
});
}
/**
*下載圖片
*@paramimageUrl网络图片地址
*@return返回bitmap对象
*/
publicBitmapdownloadImage(StringimageUrl){
Bitmapbitmap=null;
try{
URLurl=newURL(imageUrl);
HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
bitmap=BitmapFactory.decodeStream(conn.getInputStream());
conn.disconnect();
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnbitmap;
}
}
ImageCache类
importandroid.graphics.Bitmap;
importandroid.util.LruCache;
/**
*CreatedbyAdministratoron2016/3/1.
*/
publicclassImageCache{
publicImageCache(){
//初始化图片缓存
initImageCache();
}
//图片缓存类
LruCache<String,Bitmap>imageCache;
/**
*初始化缓存
*/
privatevoidinitImageCache(){
//计算可使用的最大内存
intmaxMemory=(int)(Runtime.getRuntime().maxMemory()/1024);
//只用最大内存的四分之一作为缓存大小
intcacheSize=maxMemory/4;
imageCache=newLruCache<String,Bitmap>(cacheSize){
@Override
protectedintsizeOf(Stringkey,Bitmapvalue){
returnvalue.getRowBytes()*value.getHeight()/1024;
}
};
}
/**
*添加缓存
*
*@paramurl缓存的图片url作为缓存的key
*@parambitmap缓存的bitmap
*/
publicvoidput(Stringurl,Bitmapbitmap){
imageCache.put(url,bitmap);
}
/**
*获取缓存的图片
*
*@paramurl
*@return
*/
publicBitmapget(Stringurl){
Bitmapbitmap=null;
bitmap=imageCache.get(url);
returnbitmap;
}
}
你会发现,我们的Imageloader在实现缓存的时候,就需要直接跟缓存类ImageCache打交道。
我们想一下,给个代理商的类
这个代理商类,我们就直接命名为ImageCache,所以,ImageCache现在的内容如下
importandroid.graphics.Bitmap;
/**
*CreatedbyAdministratoron2016/3/1.
*/
publicinterfaceImageCache{
/**
*添加缓存
*@paramurl缓存的图片url作为缓存的key
*@parambitmap缓存的bitmap
*/
publicvoidput(Stringurl,Bitmapbitmap);
/**
*获取缓存的图片
*@paramurl
*@return
*/
publicBitmapget(Stringurl);
}
ImageCache只需要作为你的iphone手机跟厂商的桥梁,而现在的厂商是ImageLoader,它直接跟代理商ImageCache打交道
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.widget.ImageView;
importjava.io.IOException;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
/**
*CreatedbyAdministratoron2016/3/1.
*/
publicclassImageLoader{
publicImageLoader(){
}
//默认使用内存缓存
ImageCacheimageCache=newMemoryCache();
//线程池,线城数量为cpu的数量
ExecutorServicemExecutorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
/**
*设置要使用哪种缓存
*@paramimageCache缓存类
*/
publicvoidsetImageCache(ImageCacheimageCache){
this.imageCache=imageCache;
}
/**
*显示图片
*@paramurl图片的url
*@paramimageView要显示的view
*/
publicvoiddisplayImage(finalStringurl,finalImageViewimageView){
Bitmapbitmap=imageCache.get(url);
if(bitmap!=null){
imageView.setImageBitmap(bitmap);
return;
}
imageView.setTag(url);
mExecutorService.submit(newRunnable(){
@Override
publicvoidrun(){
Bitmapbitmap=downloadImage(url);
if(bitmap==null){
return;
}
if(imageView.getTag().equals(url)){
imageView.setImageBitmap(bitmap);
}
//添加到缓存
imageCache.put(url,bitmap);
}
});
}
/**
*下載圖片
*@paramimageUrl网络图片地址
*@return返回bitmap对象
*/
publicBitmapdownloadImage(StringimageUrl){
Bitmapbitmap=null;
try{
URLurl=newURL(imageUrl);
HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
bitmap=BitmapFactory.decodeStream(conn.getInputStream());
conn.disconnect();
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnbitmap;
}
}
这个时候,我们只需要建立一个实现了ImageCache接口的实现类,也就是买了iphone100的你自己
importandroid.graphics.Bitmap;
importandroid.util.LruCache;
/**
*CreatedbyAdministratoron2016/3/1.
*/
publicclassMemoryCacheimplementsImageCache{
publicMemoryCache(){
//初始化图片缓存
initImageCache();
}
//图片缓存类
LruCache<String,Bitmap>memoryCache;
/**
*初始化缓存
*/
privatevoidinitImageCache(){
//计算可使用的最大内存
intmaxMemory=(int)(Runtime.getRuntime().maxMemory()/1024);
//只用最大内存的四分之一作为缓存大小
intcacheSize=maxMemory/4;
memoryCache=newLruCache<String,Bitmap>(cacheSize){
@Override
protectedintsizeOf(Stringkey,Bitmapvalue){
returnvalue.getRowBytes()*value.getHeight()/1024;
}
};
}
/**
*添加缓存
*
*@paramurl缓存的图片url作为缓存的key
*@parambitmap缓存的bitmap
*/
publicvoidput(Stringurl,Bitmapbitmap){
memoryCache.put(url,bitmap);
}
/**
*获取缓存的图片
*
*@paramurl
*@return
*/
publicBitmapget(Stringurl){
Bitmapbitmap=null;
bitmap=memoryCache.get(url);
returnbitmap;
}
}
这样,我们就实现了迪米特原则,一个对象应该对其他对象有最少的了解,即两个类之间没有直接关系,也就降低了耦合度,在需要添加一个卖肾买iphone的人的时候,只需要实现ImageCache接口,就能实现保修。
对于上面的解释你可能会比较迷糊,我专业点解释一下,其实就是,我们这个ImageLoader图片加载器原先在实现缓存的时候,是直接跟缓存类ImageCache打交道的,也就说明了,一但我们需要添加新的缓存方式,我们就需要更改ImageLoader里面的代码,这样明显的说明了,两个类之间是有直接关系的,而迪米特原则就是,不要有直接关系,或者说,关系越小越好,所以,我们拆开来,搞了一个中间的接口ImageCache,而真正的实现缓存的MemoryCache内存缓存类,实现了ImageCache接口,在ImageLoader中,我们只需要使用ImageCache接口就行,这样,用户在使用哪一种缓存的时候,只要实现ImageCache接口就能实现自己想要的缓存方式,而且还不需要修改ImageLoader类里面的代码,只需要通过调用ImageLoader里面的
/**
*设置要使用哪种缓存
*@paramimageCache缓存类
*/
publicvoidsetImageCache(ImageCacheimageCache){
this.imageCache=imageCache;
}
这个方法就能通过依赖注入的方式,选择自己想要使用的缓存方式。