实现简单的ImageLoader

Android开发中经常会对图片进行处理,图片如何加载和缓存的实现有难有易,这里实现一个简单的ImageLoader,只是简述其中的基本原理。

我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。

整个实现需要用到图片的缓存和加载,首先需要实现图片的缓存。Android手机缓存又分别可以用到内存和sd卡,内存实现ImageCache

 

public class ImageCache {

	LruCache<String, Bitmap> mImageCache;

	public ImageCache() {
		// TODO Auto-generated constructor stub
		initImageCache();
	}

	private void initImageCache() {
		// 计算可使用的最大内存
		final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
		// 取四分之一的可用内存作为缓存
		final int cacheSize = maxMemory / 4;

		mImageCache = new LruCache<String, Bitmap>(cacheSize) {
			protected int sizeOf(String key, Bitmap bitmap) {
				return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
			};
		};
	}

	public void put(String url, Bitmap bitmap) {
		mImageCache.put(url, bitmap);
	}

	public Bitmap get(String url) {
		return mImageCache.get(url);
	}
}


DiskCache类实现图片缓存到SD卡中

 

public class DiskCache {

	static String cacheDir = "sd卡的路径";

	// 从缓存中获取图片
	public Bitmap get(String url) {
		return BitmapFactory.decodeFile(cacheDir + url);
	}

	// 将图片缓存到内存中
	public void put(String url, Bitmap bitmap) {
		FileOutputStream fileOutputStream = null;
		try {
			fileOutputStream = new FileOutputStream(cacheDir + url);
			bitmap.compress(CompressFormat.PNG, 100, fileOutputStream);
		} catch (Exception e) {
			// TODO: handle exception
		} finally {
			if (fileOutputStream!=null) {
				try {
					fileOutputStream.close();
				} catch (Exception e2) {
					// TODO: handle exception
				}
			}
		}
	}
}


最后在ImageLoader类中分别实现两个缓存:

 

public class ImageLoader {
	// 图片缓存 内存缓存
	ImageCache mImageCache = new ImageCache();
	// SD卡缓存
	DiskCache mDiskCache = new DiskCache();
	// 是否使用SD卡缓存
	boolean isUseDiskCache = false;
	// 线程池,线程数量为CPU数量
	ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime
			.getRuntime().availableProcessors());

	public void displayImage(final String url, final ImageView imageView) {
		Bitmap bitmap = isUseDiskCache ? mDiskCache.get(url) : mImageCache
				.get(url);
		if (bitmap != null) {
			imageView.setImageBitmap(bitmap);
			return;
		}
		imageView.setTag(url);
		mExecutorService.submit(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				Bitmap bitmap = downloadImage(url);
				if (bitmap == null) {
					return;
				}
				if (imageView.getTag().equals(url)) {
					imageView.setImageBitmap(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();
		} catch (Exception e) {
			// TODO: handle exception
		}
		return bitmap;
	}

	public void useDiskCache(boolean useDiskCache) {
		isUseDiskCache = useDiskCache;
	}
}

阅读原文http://click.aliyun.com/m/34567/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值