1.定义:单一职责原则的缩写是SPR就一个类而言,应该仅有一个引起他变化的原因。
2.案例:实现图片加载器,功能图片加载与缓存。
ImageLoader 0.1版本
public class ImageLoader(){
//图片缓存
LruCache<String,BitMap> mImageCache;
//线程池,线程数量为cpu 数量
ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availbleProcessors());
public ImageLoader(){
initImageCache();
}
private initImageCahe(){
//计算可以使用的最大内存
final int maxMenory = (int)(Runtime.getRuntime().maxMemory /1024);
//取1/4 的可用内存作为缓存
final int cacheSize=maxMemory/4;
mImageCache = new LruCache<String,Bitmap>(cacheSize){
@override
protected int sizeOf(String key,Bitmap bitmap){
return bitmap.getRowBytes()*bitmap.getHeight()/1024;
}
};
}
public void displayImage(final String url,final ImageView){
imageView.setTag(url);
mExecutorServices.submit(new Runnable(){
@override
public void run(){
Bitmap bitmap=downLoadImage(url);
if(bitmap == null){
return;
}
if(imageView.getTag().equals(url)){
imageView.setBitmap(bitmap);
}
mImageCache.put(url,bitmap);
}
});
}
public Bitmap downLoadImage(String imageUrl){
Bitmap bitmap = null;
try{
URL url=new URL(imageUrl);
final HttpURLConnection conn=(HttpURLConnection)url.openConnection();
bitmap=BitmapFactory.decodeStream(conn.getInputStream());
conn.disconnect();
}cache(Exception e){
e.printStackTrace();
}
return bitmap;
}
}
使用单一职责原则对该ImageLoader 进行改造。将ImageLoader 类一分为二,ImageLoader只负责图片的加载逻辑,ImageCache 只负责处理图片的缓存逻辑。重构之后类的职责变得清晰。
public class ImageLoader(){
//图片缓存
ImageCache mImageCache =new ImageCache();
//线程池,线程数量为cpu 数量
ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availbleProcessors());
public void displayImage(final String url,final ImageView){
BitMap bitMap =mImageCache.get(url);
if(bitmap != null){
imageView.setBitmap(bitmap);
return;
}
imageView.setTag(url);
mExecutorServices.submit(new Runnable(){
@override
public void run(){
Bitmap bitmap=downLoadImage(url);
if(bitmap == null){
return;
}
if(imageView.getTag().equals(url)){
imageView.setBitmap(bitmap);
}
mImageCache.put(url,bitmap);
}
});
}
public Bitmap downLoadImage(String imageUrl){
Bitmap bitmap = null;
try{
URL url=new URL(imageUrl);
final HttpURLConnection conn=(HttpURLConnection)url.openConnection();
bitmap=BitmapFactory.decodeStream(conn.getInputStream());
conn.disconnect();
}cache(Exception e){
e.printStackTrace();
}
return bitmap;
}
}
public class ImageCahe{
public class ImageLoader(){
//图片缓存
LruCache<String,BitMap> mImageCache;
public ImageCahe(){
initImageCache();
}
private initImageCahe(){
//计算可以使用的最大内存
final int maxMenory = (int)(Runtime.getRuntime().maxMemory /1024);
//取1/4 的可用内存作为缓存
final int cacheSize=maxMemory/4;
mImageCache = new LruCache<String,Bitmap>(cacheSize){
@override
protected int sizeOf(String key,Bitmap bitmap){
return bitmap.getRowBytes()*bitmap.getHeight()/1024;
}
};
}
public void put(String url,Bitmap){
mImageCache.put(url,bitmap);
}
public Bitmap get(String url){
return mImageCache.get(url);
}
}