關鍵字:緩衝池,載入隊列
/** * Title:圖片非同步載入類 * Description: * Copyright:Copyright(c) 2012 * Company: * * @author tom_liang */package com.zouba.dd.ui.util;import java.io.IOException;import java.io.InputStream;import java.io.Serializable;import java.lang.ref.SoftReference;import java.net.MalformedURLException;import java.net.URL;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.os.Handler;import android.os.Message;public class DandanAsynchImageLoader {public static boolean isStop = false;//是否停止非同步載入圖片線程private static Object locker = new Object();//同步鎖private static Thread loadThread = null;//非同步載入線程對象private static Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();//所有圖片緩衝private static List<AsynchImage> taskQueue = new ArrayList<AsynchImage>();//非同步載入任務的隊列//訊息處理器private static final Handler handler = new Handler() {public void handleMessage(Message message) {//當前任務載入到圖片後,執行回調Bundle bundle = message.getData();AsynchImage asynchImage = (AsynchImage)bundle.getSerializable("handled_task");asynchImage.getCallback().imageLoaded((Drawable) message.obj,asynchImage.getImgURL());}};static {DandanAsynchImageLoader.loadThread = new Thread() {public void run() {while (!DandanAsynchImageLoader.isStop) {synchronized (locker) {if (taskQueue.size() == 0) {try {locker.wait();} catch (InterruptedException e) {e.printStackTrace();}}AsynchImage temptask = taskQueue.remove(0);Drawable drawable = loadImageFromUrl(temptask.getImgURL());imageCache.put(temptask.getImgURL(),new SoftReference<Drawable>(drawable));Message message = handler.obtainMessage(0,drawable);Bundle bundle = new Bundle();bundle.putSerializable("handled_task", temptask);message.setData(bundle);handler.sendMessage(message);locker.notifyAll();}}}};//啟動非同步線程(網路事件線程)DandanAsynchImageLoader.loadThread.start();}/** * 非同步載入圖片的靜態方法,首先檢查緩衝裡面是否有之前載入好的圖片 * 有的話直接返回;沒有,加入到非同步任務隊列進行載入 * @param imageUrl網路替片的URL * @param imageCallback回調介面 * @return 返回非同步圖片的Drawable對象 */public static Drawable loadDrawable(final String imageUrl,final ImageCallback imageCallback) {if (imageCache.containsKey(imageUrl)) {SoftReference<Drawable> softReference = imageCache.get(imageUrl);Drawable drawable = softReference.get();if (drawable != null) {return drawable;}}new Thread(){public void run(){synchronized (locker) {if( !taskQueue.contains(imageUrl) ){taskQueue.add(new AsynchImage(imageUrl, imageCallback));}locker.notifyAll();}}}.start();return null;}/** * 網狀圖片載入的回調介面 * @author zouba * */public interface ImageCallback {public void imageLoaded(Drawable imageDrawable, String imageUrl);}/** * 描述:真實的網狀圖片載入方法 * @param url網狀圖片的地址 * @return 返回網狀圖片的Drawable對象 */private static Drawable loadImageFromUrl(String url) {URL m;InputStream i = null;try {m = new URL(url);i = (InputStream) m.getContent();} catch (MalformedURLException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}Drawable d = Drawable.createFromStream(i, "src");return d;}/************************************************************************************* * 非同步載入圖片的Java Bean,對非同步圖片資訊的簡單封裝 *************************************************************************************/static class AsynchImage implements Serializable{private static final long serialVersionUID = 1L;private String imgURL;private ImageCallback callback;public AsynchImage(String imgURL, ImageCallback callback) {this.imgURL = imgURL;this.callback = callback;}public String getImgURL() {return imgURL;}public void setImgURL(String imgURL) {this.imgURL = imgURL;}public ImageCallback getCallback() {return callback;}public void setCallback(ImageCallback callback) {this.callback = callback;}}}