package coolbuy360.service;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ImageView;
public class AaynImageLoaderUtil {
private static final String TAG = "AsynImageLoader";
public static final String CACHE_DIR ="/searchHealth";
// �������ع���ͼƬ��Map
private Map<String, SoftReference<Bitmap>> caches=null;
// �����������
private List<Task> taskQueue;
private boolean isRunning = false;
/**
* ���պ���
*/
public AaynImageLoaderUtil(){
//StrictModeWrapper.init(this);
// ��ʼ������
caches = new HashMap<String, SoftReference<Bitmap>>();
taskQueue = new ArrayList<AaynImageLoaderUtil.Task>();
// ����ͼƬ�����߳�
isRunning = true;
new Thread(runnable).start();
}
/**
*
* @param imageView ��Ҫ�ӳټ���ͼƬ�Ķ���
* @param url ͼƬ��URL��ַ
* @param resId ͼƬ���ع�������ʾ��ͼƬ��Դ
*/
public void showImageAsyn(ImageView imageView, String url, int resId){
imageView.setTag(url);
Bitmap bitmap = loadImageAsyn(url, getImageCallback(imageView, resId));
if(bitmap == null){
imageView.setImageResource(resId);
}else{
imageView.setImageBitmap(bitmap);
}
}
/* public Bitmap showImageAsyn(String url, int resId)
{
Bitmap bitmap = loadImageAsyn(url, getImageCallback( resId));
return bitmap;
}*/
/**
* ����ͼƬ��1,ͼƬ�������������棬2ͼƬ�����ڴ濨��3����������ͼƬ��
* @param path
* ͼƬ��url
* @param callback
* �ص�����
* @return
*/
public Bitmap loadImageAsyn(String path, ImageCallback callback){
// �жϻ������Ƿ��Ѿ����ڸ�ͼƬ
//File cacheFile = fileUtril.getCacheFile(path);
//boolean isexists=cacheFile.exists();//�ж�sd�����Ƿ���ڴ�ͼƬ
//Log.i(TAG, "haha:"+cacheFile.getName()+"");
if(caches.containsKey(path)){
// ȡ��������
Log.i("test", "�����ڻ�����");
SoftReference<Bitmap> rf = caches.get(path);
// ͨ�������ã���ȡͼƬ
Bitmap bitmap = rf.get();
Log.i(TAG, "returning image in cache" + path);
// �����ͼƬ�Ѿ����ͷţ���path��Ӧ�ļ���Map���Ƴ���
if(bitmap == null){
caches.remove(path);
System.gc();//����ϵͳ��ʱ����
}else{
// ���ͼƬδ���ͷţ�ֱ�ӷ��ظ�ͼƬ
Log.i(TAG, "return image in cache" + path);
return bitmap;
}
}
//������建������û�еĻ��ж�sd���������û��
/* else if(fileUtril.getFileName(path).length()>0&isexists)
{
Bitmap bitmap=null;
try {
bitmap = BitmapFactory.decodeFile(cacheFile.getCanonicalPath());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.i(TAG, "sdcard ," + path);
return bitmap;
}*/
else{
// ��������в� ���ڸ�ͼƬ����ͼƬ��������
Task task = new Task();
task.path = path;
task.callback = callback;
Log.i(TAG, "new Task ," + path);
if(!taskQueue.contains(task)){
taskQueue.add(task);
// �����������ض���
synchronized (runnable) {
runnable.notify();
}
}
}
// ������û��ͼƬ��null
return null;
}
/**
*
* @param imageView
* @param resId ͼƬ�������ǰ��ʾ��ͼƬ��ԴID
* @return
*/
public ImageCallback getImageCallback(final ImageView imageView, final int resId){
return new ImageCallback() {
@Override
public void loadImage(String path, Bitmap bitmap) {
if(path.equals(imageView.getTag().toString())){
imageView.setImageBitmap(bitmap);
}else{
imageView.setImageResource(resId);
}
}
};
}
/**
*
* @param imageView
* @param resId ͼƬ�������ǰ��ʾ��ͼƬ��ԴID
* @return
*/
private ImageCallback getImageCallback(){
return new ImageCallback() {
@Override
public void loadImage(String path, Bitmap bitmap) {
}
};
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// ���߳��з��ص�������ɵ�����
Task task = (Task)msg.obj;
// ����callback�����loadImage����������ͼƬ·����ͼƬ�ش���adapter
task.callback.loadImage(task.path, task.bitmap);
}
};
private Runnable runnable = new Runnable() {
@Override
public void run() {
while(isRunning){
// �������л���δ���������ʱ��ִ����������
while(taskQueue.size() > 0){
// ��ȡ��һ��������֮�����������ɾ��
Task task = taskQueue.remove(0);
// �����ص�ͼƬ��ӵ�����
task.bitmap = picUtril.getbitmap(task.path);
caches.put(task.path, new SoftReference<Bitmap>(task.bitmap));
Log.i("caches", "����ͼƬ"+task.path);
if(handler != null){
// ������Ϣ��������ɵ�������ӵ���Ϣ������
Message msg = handler.obtainMessage();
msg.obj = task;
// ������Ϣ�����߳�
handler.sendMessage(msg);
}
}
//�������Ϊ��,�����̵߳ȴ�
synchronized (this) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
};
//�ص��ӿ�
public interface ImageCallback{
void loadImage(String path, Bitmap bitmap);
}
class Task{
// �������������·��
String path;
// ���ص�ͼƬ
Bitmap bitmap;
// �ص�����
ImageCallback callback;
@Override
public boolean equals(Object o) {
Task task = (Task)o;
return task.path.equals(path);
}
}
}