線程池+緩存+Handler 異步加載網絡圖片
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.drawable.Drawable; import android.os.Handler; import android.util.Log;
/**
線程池+緩存+Handler加載圖片 */ public class AsyncLoadImage { //緩存 private Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>(); //線程池 private ExecutorService executorService = Executors.newFixedThreadPool(20);//總共有10個線程循環使用 //Hanlder private Handler mHandler = new Handler(); public interface ImageCallback {
void imageLoad(Drawable image, String imageUrl);
} /*
- @param imageUrl 圖片的地址
- @param imageCallback 回調接口
@return 返回內存中緩存的圖像 第一次返回null */ public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) { Log.i("AsyncLoadImage", "loadDrawable()" + imageUrl); //如果緩存中有則從緩存中取出來 if(imageCache.containsKey(imageUrl)) {
SoftReference<Drawable> softReference = imageCache.get(imageUrl); if(softReference.get() != null) { //判斷是否有drawable return softReference.get(); //有則返回 }
} //使用線程池下載圖片 executorService.submit(new Runnable() {
@Override public void run() { try { // final Drawable drawable = Drawable.createFromStream(new URL(imageUrl).openStream(), "image.jpg"); final Drawable drawable = getDrawableFormUrl(imageUrl); //調用獲取數據的方法 imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));//將加載的圖片放入到內存中 mHandler.post(new Runnable() { @Override public void run() { imageCallback.imageLoad(drawable, imageUrl); //接口回調 } }); } catch (Exception e) { throw new RuntimeException(); } }
}); return null ; } /**
- 從網絡上獲取數據
*/
public Drawable getDrawableFormUrl(String imageUrl) {
Drawable drawable = null ;
try {
} catch (Exception e) {drawable = Drawable.createFromStream(new URL(imageUrl).openStream(), "image.jpg");
} return drawable ; }throw new RuntimeException();
}</pre>