package com.smartisanos.sidebar.util; import java.util.ArrayList; import java.util.List; import android.graphics.Bitmap; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; public final class ImageLoader { private static final LOG log = LOG.getInstance(ImageLoader.class); private static final int THREAD_NUM = 3; private static final int MSG_IMAGE_LOAD = 1; private BitmapCache mCache; private List<Handler> mHandlers; public ImageLoader(int photoSize) { mCache = new BitmapCache(photoSize); mHandlers = new ArrayList<Handler>(); for(int i = 0; i < THREAD_NUM; ++ i){ HandlerThread handlerthread = new HandlerThread("imageloader" + i, android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY); handlerthread.start(); mHandlers.add(new ImageHandler(handlerthread.getLooper())); } } public void loadImage(String filepath, Callback callback) { if (filepath == null || callback == null) { return; } /** Bitmap cur = mCache.getBitmapDirectly(filepath); if(cur != null){ callback.onLoadComplete(filepath, cur); return; } **/ ThreadVerify.verify(true); LoadItem item = new LoadItem(); item.filePath = filepath; item.callback = callback; Handler handler = mHandlers.get(((filepath.hashCode() % mHandlers.size()) + mHandlers.size()) % mHandlers.size()); Message msg = handler.obtainMessage(MSG_IMAGE_LOAD, item); handler.sendMessageAtFrontOfQueue(msg); } private final class ImageHandler extends Handler { public ImageHandler(Looper looper) { super(looper, null, false); } @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_IMAGE_LOAD: LoadItem item = (LoadItem) msg.obj; ImageLoader.Callback callback = item.callback; if (callback != null && callback.valid()) { Bitmap bm = mCache.getBitmap(item.filePath); callback.onLoadComplete(item.filePath, bm); } } } } private final class LoadItem { String filePath; Callback callback; } public interface Callback { boolean valid(); void onLoadComplete(String filePath, Bitmap bitmap); } public void clearCache() { mCache.clearCache(); } }