实现简单的ImageLoader

简介: Android开发中经常会对图片进行处理,图片如何加载和缓存的实现有难有易,这里实现一个简单的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;
	}
}



目录
相关文章
|
缓存 Java
Imageloader<4>-ImageLoader中的变量
Imageloader<4>-ImageLoader中的变量
51 0
|
Java
Imageloader<5>-ImageLoader的变量初始化
Imageloader<5>-ImageLoader的变量初始化
55 0
Imageloader<8>-压缩图片
Imageloader<8>-压缩图片
67 0
|
缓存 Java
Imageloader<6>-mUIHandler的初始化
Imageloader<6>-mUIHandler的初始化
64 0
|
缓存
Imageloader<7>-获取图片需要显示的大小
Imageloader<7>-获取图片需要显示的大小
97 0
Imageloader<3>-单例模式
Imageloader<3>-单例模式
53 0
|
Android开发 容器 Python
DialogFragment源码分析
目录介绍 1.最简单的使用方法 1.1 官方建议 1.2 最简单的使用方法 1.3 DialogFragment做屏幕适配 2.源码分析 2.1 DialogFragment继承Fragment 2.
1185 0
|
缓存 Android开发 异构计算
Glide、Picasso和Fresco
Glide、Picasso和Fresco
382 0
Glide、Picasso和Fresco
|
XML 数据格式
FileProvider使用以及源码浅析
FileProvider使用以及源码浅析
FileProvider使用以及源码浅析
|
安全 开发者
MJRefresh源码分析
MJRefresh源码分析
175 0
MJRefresh源码分析