package cn.edu.chd.utils;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.os.Handler;
import android.os.Message;
/**
* @author Rowand jj
*
*ͼƬ������
* ���ڼ���ͼƬ���ȴӻ����м���ͼƬ�����û���ҵ������·������ͼƬ
*/
public class NativeImageLoader
{
private static NativeImageLoader imageLoader = new NativeImageLoader();
private static final int THREAD_NUM = 2;
private static final int DEFAULT_WIDTH = 140;//Ĭ�Ͽ��
private static final int DEFAULT_HEIGHT = 170;//Ĭ�ϸ߶�
protected static final int LOAD_OK = 1;
private ExecutorService threadPool = null;//�̳߳�
private NativeImageLoader()
{
}
public static NativeImageLoader getInstance()
{
return imageLoader;
}
/**
* ����ͼƬ
* @param path
* @param mPoint
* @param mCallBack
* @return
*/
public Bitmap loadNativeImage(final String path,Point mPoint, final NativeImageLoaderCallback mCallBack)
{
if(path == null)
{
return null;
}
if(mPoint == null)
{
mPoint = new Point(DEFAULT_WIDTH,DEFAULT_HEIGHT);
}
final int x = mPoint.x;
final int y = mPoint.y;
//�ӻ����ȡͼƬ
Bitmap bitmap = BitmapLruCacheHelper.getInstance().getBitmapFromMemCache(path);
if(bitmap != null)
{
return bitmap;
}else
{
final Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
if(msg.what == LOAD_OK)
{
mCallBack.onImageLoad((Bitmap)msg.obj, path);
}
}
};
//�����̼߳���bitmap���������غõ�bitmap�ŵ���Ϣ������
getThreadPool().execute(new Runnable()
{
@Override
public void run()
{
//���ص��Ǿ����ü���bitmap
Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile(path, x, y);
Message msg = Message.obtain(handler, LOAD_OK, bitmap);
msg.sendToTarget();
BitmapLruCacheHelper.getInstance().addBitmapToMemCache(path, bitmap);
}
});
}
return null;
}
/**
* �h��
*/
public synchronized void cancellTask()
{
if(threadPool != null)
{
threadPool.shutdownNow();
threadPool = null;
}
}
/**
* ��ȡ�̳߳�ʵ��
*/
public ExecutorService getThreadPool()
{
if (threadPool == null)
{
synchronized (ExecutorService.class)
{
if (threadPool == null)
{
threadPool = Executors.newFixedThreadPool(THREAD_NUM);
}
}
}
return threadPool;
}
/**
* @author Rowand jj
*
*�ص��ӿ�
*/
public interface NativeImageLoaderCallback
{
public void onImageLoad(Bitmap bitmap,String path);
}
}