这里应该有两个问题,主要的是从网络读取的图片需要缓存,另一个是当你手机里有大量的图片你需要读取的时候(比如做一个android图片浏览器时)也需要进行缓存。
1、从服务器读取图片进行缓存
import java.io.IOException;
import java.lang.ref.SoftReference;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.os.Handler;
public class InternetCache {
}
class AsyncImageLoader{
public Map<String,SoftReference> imageCache = new HashMap<String,SoftReference>();
//在线程池里生成5个线程
private ExecutorService service=Executors.newFixedThreadPool(5);
private Handler handle=new Handler();
//先将几个网址传进去
String url="你所要下载图片的地址";
private Drawable loadImageFromUrl(final String imageUrl,
final ImageCallback callback) {
// TODO Auto-generated method stub
//看看我们的本地缓存里面有木有存
if (imageCache.containsKey(imageUrl)) {
SoftReference softReference = imageCache.get(imageUrl);
if (softReference.get() != null) {
return (Drawable)softReference.get();
}
}
// 缓存中没有图像,则从网络上取出数据,并将取出的数据缓存到内存中
service.submit(new Runnable(){
public void run(){
try{
final Drawable drawable=loadUrl(url);
imageCache.put(imageUrl,new SoftReference(drawable));
handle.post(new Runnable(){
//handle.post就是启动一个runnable让其在handle绑定的thread中运行
public void run(){
callback.imageLoaded(drawable);
}
});
}catch(Exception e){
throw new RuntimeException(e);
}
}
});
return null;
}
private Drawable loadUrl(String url) throws MalformedURLException, IOException{
return Drawable.createFromStream(new URL(url).openStream(), "image.png");
//return BitmapFactory.decodeStream(new URL(url).openStream());这样也行哈
}
public interface ImageCallback {
// 注意 此方法是用来设置目标对象的图像资源
public void imageLoaded(Drawable imageDrawable);
}
}
主activity方法
private AsyncImageLoader asyncImageLoader = new AsyncImageLoader(); // 引入线程池,并引入内存缓存功能,并对外部调用封装了接口,简化调用过程 private void loadImage(final String url, final int id) { // 如果缓存过就会从缓存中取出图像,ImageCallback接口中方法也不会被执行 Drawable cacheImage = asyncImageLoader3.loadDrawable(url, new AsyncImageLoader3.ImageCallback() { // 请参见实现:如果第一次加载url时下面方法会执行 public void imageLoaded(Drawable imageDrawable) { ((ImageView) findViewById(id)) .setImageDrawable(imageDrawable); } }); if (cacheImage != null) { ((ImageView) findViewById(id)).setImageDrawable(cacheImage); } }