package com.dashu.imageloader;
import java.io.InputStream;
import java.lang.ref.SoftReference;
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.os.Handler;
/**
* 网络图片加载类 该类涉及到线程池和Bitmap软引用知识
* */
public class AsyncImageLoader {
/**
* 内存中开启缓存,采用软引用防止内存泄漏
* */
private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<>();
/**
* 固定5个线程来执行任务
* */
private ExecutorService executorService = Executors.newFixedThreadPool(5);
private final Handler handler = new Handler();
public Bitmap loadBitmap(final String imageUrl, final ImageCallback callback) {
// 如果缓存过就从缓存中取出数据
if (imageCache.containsKey(imageUrl)) {
SoftReference<Bitmap> softReference = imageCache.get(imageUrl);
if (softReference.get() != null) {
return softReference.get();
}
}
// 缓存中没有图像,则从网络上取出数据,并将取出的数据缓存到内存中
executorService.submit(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
final Bitmap bitmap = loadImageFromUrl(imageUrl);
imageCache.put(imageUrl, new SoftReference<Bitmap>(bitmap));
handler.post(new Runnable() {
public void run() {
if (callback != null) {
callback.imageLoaded(bitmap);
}
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
return null;
}
/**
* 从网络上获取数据的方法
* */
private Bitmap loadImageFromUrl(String imageUrl) {
try {
URL url = new URL(imageUrl);
Bitmap imageBitmap = null;
try {
InputStream is = url.openStream();
imageBitmap = BitmapFactory.decodeStream(is);
} catch (Exception e) {
e.printStackTrace();
}
return imageBitmap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 外界开放的回调接口
* */
public interface ImageCallback {
// 注意 此方法是用来设置目标对象的图像资源
public void imageLoaded(Bitmap bitmap);
}
}
package com.dashu.imageloader;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.widget.ImageView;
public class MainActivity extends Activity {
private AsyncImageLoader asyncImageLoader = new AsyncImageLoader();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadImage("http://www.baidu.com/img/baidu_logo.gif", R.id.image_01);
loadImage("http://www.chinatelecom.com.cn/images/logo_new.gif",
R.id.image_02);
loadImage("http://cache.soso.com/30d/img/web/logo.gif", R.id.image_03);
loadImage("http://csdnimg.cn/www/images/csdnindex_logo.gif",
R.id.image_04);
loadImage("http://images.cnblogs.com/logo_small.gif", R.id.image_05);
}
private void loadImage(String url, final int id) {
Bitmap cacheBitmap = asyncImageLoader.loadBitmap(url,
new AsyncImageLoader.ImageCallback() {
@Override
public void imageLoaded(Bitmap bitmap) {
// TODO Auto-generated method stub
((ImageView) findViewById(id)).setImageBitmap(bitmap);
}
});
if (cacheBitmap != null) {
((ImageView) findViewById(id)).setImageBitmap(cacheBitmap);
}
}
}