博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Android源码设计模式解析与实战》——面向对象的六大原则的图片加载器源码...
阅读量:7053 次
发布时间:2019-06-28

本文共 3640 字,大约阅读时间需要 12 分钟。

缓存接口

ImageCache:

public interface ImageCache{	public Bitmap get(String url);	public void put(String url,Bitmap bitmap);}复制代码
内存缓存

MemoryCache:

public class MemoryCache implements ImageCache{	private LruCache
mMemoryCache; public MemoryCache() { initImageCache(); } private void initImageCache() { //计算可使用的最大内存 final int maxMemory = (int)(Runtime.getRuntime().maxMemory() / 1024); //取1/4作为缓存 final int cacheSize = maxMemory / 4; mMemoryCache = new LruCache
(cacheSize) { @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight() / 4; } }; } @Override public Bitmap get(String url) { return mMemoryCache.get(url); } @Override public void put(String url, Bitmap bitmap) { mMemoryCache.put(url,bitmap); }}复制代码
磁盘缓存

DiskCache :

public class DiskCache implements ImageCache{	static String cacheDir = "sdcard/cache/";	@Override	public Bitmap get(String url)	{		return BitmapFactory.decodeFile(cacheDir+url);	}	@Override	public void put(String url, Bitmap bmp)	{		FileOutputStream fileOutputStream = null;		try		{			fileOutputStream = new FileOutputStream(cacheDir + url);			bmp.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);		}		catch(Exception e)		{			e.printStackTrace();		}		finally		{			CloseUtils.closeQuitely(fileOutputStream);			if(fileOutputStream != null)			{				try				{					fileOutputStream.close();				}				catch(IOException e)				{					e.printStackTrace();				}			}		}	}}复制代码
流工具

CloseUtils:

public class CloseUtils{	private CloseUtils(){}	/**	 * 关闭closeable对象	 * @param closeable	 */	public static void closeQuitely(Closeable closeable){		if(closeable != null){			try			{				closeable.close();			}			catch(IOException e)			{				e.printStackTrace();			}		}	}}复制代码
双缓存实现

DoubleCache :

/** * 双缓存,获取图片先从内存,内存没有在从sdcard获取 * 缓存时在内存和sdcard各缓存一份 */public class DoubleCache implements ImageCache{	private MemoryCache mMemoryCache = new MemoryCache();	private DiskCache mDiskCache = new DiskCache();	@Override	public Bitmap get(String url)	{		Bitmap bitmap = mMemoryCache.get(url);		if(bitmap == null){			bitmap = mDiskCache.get(url);		}		return bitmap;	}	@Override	public void put(String url, Bitmap bitmap)	{		mMemoryCache.put(url,bitmap);		mDiskCache.put(url,bitmap);	}}复制代码
图片加载器的实现

ImageLoader:

public class ImageLoader{	//内存缓存	private ImageCache mImageCache = new MemoryCache();	//线程池,个数为cpu的数量	private ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());	/**	 * 注入缓存实现	 * @param cache	 */	public void setImageCache(ImageCache cache){		this.mImageCache = cache;	}	//加载图片	public void displayImage(String url, ImageView imageView){		Bitmap bitmap = mImageCache.get(url);		if(bitmap != null){			imageView.setImageBitmap(bitmap);			return;		}		//没有缓存提交到线程池下载图片		submitLoadRequest(url,imageView);	}	private void submitLoadRequest(final String url, final ImageView imageView)	{		imageView.setTag(url);		mExecutorService.submit(new Runnable()		{			@Override			public void run()			{				Bitmap bitmap = downloadImage(url);				if(bitmap == null){					return;				}				if(imageView.getTag().equals(url)){					imageView.setImageBitmap(bitmap);				}				mImageCache.put(url,bitmap);			}		});	}	/**	 * 下载图片	 * @param imageUrl	 * @return	 */	private Bitmap downloadImage(String imageUrl)	{		Bitmap mBitmap = null;		try		{			URL url = new URL(imageUrl);			final HttpURLConnection conn = (HttpURLConnection)url.openConnection();			mBitmap = BitmapFactory.decodeStream(conn.getInputStream());			conn.disconnect();		}		catch(Exception e)		{			e.printStackTrace();		}		return mBitmap;	}}复制代码

转载地址:http://zllol.baihongyu.com/

你可能感兴趣的文章
5分钟,关于Python 解包,你需要知道的一切
查看>>
卫星定位领域相关基础知识汇总
查看>>
Windows10 VS2017 C++使用crypto++库加密解密(AES)
查看>>
喜鹊医药获近亿元B轮融资,助力创新药物研究开发
查看>>
AnalyticDB for PostgreSQL (原HybridDB for PostgreSQL) 实时数据仓库上手指南
查看>>
分组填报表的制作
查看>>
Elasticsearch数据
查看>>
共享雨伞漂流伞获近亿元战略投资,投资方为蚂蚁金服
查看>>
Cookie(1)
查看>>
Confluence 6 可以自定义的元素
查看>>
你让我怎么说
查看>>
服务器怎么租?阿里云实例规格怎么选?
查看>>
KodExplorer 4.40 发布,权限机制优化
查看>>
WPF 为资源字典 添加事件响应的后台类
查看>>
ASP.NET MVC-异常处理&自定义错误页
查看>>
官宣!阿里巴巴云效平台成功助力国内首个 DevOps 标准建设!
查看>>
分布式存储的六大优点
查看>>
Redis核心概念
查看>>
ansible 管理window主机,cmd模块
查看>>
SQL SERVER中的OLEDB等待事件
查看>>