package com.cnki.client.utils;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class ImageLoaderTools {
private HttpTools httptool;
private Context mContext;
//�߳���ѯ�Ŀ��Ʊ���
private boolean isLoop = true;
//ͼƬ���漯��
private HashMap<String, SoftReference<Bitmap>> mHashMap_caches;
//�����������
private ArrayList<ImageLoadTask> maArrayList_taskQueue;
//���ڻص�callback�еķ��������½���
private Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
ImageLoadTask _task = (ImageLoadTask) msg.obj;
Log.i("info", ""+_task);
//����callback�е�imageloaded������֪ͨ�����������
_task.callback.imageloaded(_task.path, _task.bitmap);
};
};
//���������̣߳�������ѯ������дӶ�����ͼƬ
private Thread mThread = new Thread(){
public void run() {
while(isLoop){
//�����������������ʱ��ʼִ������
while(maArrayList_taskQueue.size() >0){
try {
//������������Ƴ�����ʱ�᷵��������õ��������ض���
ImageLoadTask task = maArrayList_taskQueue.remove(0);
//������ص���Сͼ�꣬�ͽ����ص�ͼƬ��һ���ı���������Ӧ����С
if(Constant.LOADPICTYPE == 1) {
//��ʼ���أ���ȡͼƬ�ļ����ֽ�����
byte[] bytes = httptool.getByte(task.path, null, HttpTools.METHOD_GET);
//��ȡ�̶���С��ͼƬ�����Ǿ������ź��ͼƬ���ݺ�Ȳ���,���Ϊ40����������ͼ��ͼƬ
task.bitmap = BitMapTools.getBitmap(bytes, 40, 40);
//��ȡͼƬ��ԭʼ��С
} else if(Constant.LOADPICTYPE == 2) {
//��ʼ���أ���ȡͼƬ�ļ����ֽ�����
InputStream in = httptool.getStream(task.path, null, HttpTools.METHOD_GET);
//��ȡ�̶���С��ͼƬ�����Ǿ������ź��ͼƬ���ݺ�Ȳ���,���Ϊ40����������ͼ��ͼƬ
task.bitmap = BitMapTools.getBitmap(in, 1);
//Log.i("info", "task.bitmap============"+task.bitmap);
}
//���ͼƬ���سɹ������ڴ滺����ļ��з��û�����Ϣ���Ա�֮���˫�����ж�ȡͼƬ��Ϣ
if(task.bitmap != null){
//�ϻ�������ӻ���
mHashMap_caches.put(task.path,new SoftReference<Bitmap>(task.bitmap) );
//���ļ�����ӻ�����Ϣ
//��ȡ�ļ��洢·��
File dir = mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
//����ļ�·�������� ,����·��
if(!dir.exists()){
dir.mkdirs();
}
//����ͼƬ�洢·��
File file = new File(dir, task.path);
//����ļ�·���д洢ͼƬ
BitMapTools.saveBitmap(file.getAbsolutePath(), task.bitmap);
//������ɺ�����Ϣ�����߳�
Message msg = Message.obtain();
msg.obj = task;
mHandler.sendMessage(msg);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//��ǰ�̴߳��ڵȴ�״̬
synchronized (this) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
};
};
//���췽����
public ImageLoaderTools(Context context){
this.mContext = context;
httptool = new HttpTools(context);
mHashMap_caches = new HashMap<String, SoftReference<Bitmap>>();
maArrayList_taskQueue = new ArrayList<ImageLoaderTools.ImageLoadTask>();
mThread.start();
}
/**
* ͼƬ����������
* @author 3gtarena
*
*/
private class ImageLoadTask{
String path;
Bitmap bitmap;
Callback callback;
}
/**
* �ص��ӿڡ��ڵ���loadimage����ʱ����Ҫ����ص��ӿڵ�ʵ�������
* @author 3gtarena
*
*/
public interface Callback{
void imageloaded(String path,Bitmap bitmap);
}
//���������̣߳���ֹ�߳���ѯ
public void quit(){
isLoop = false;
}
/**
* ����ͼƬ·������ͼƬ �����ڴ滺����ļ�����˫��������Ż�����
* @param path
* @param callback
* @return
*/
public Bitmap imageLoad(String path,Callback callback){
Bitmap bitmap = null;
//����ڴ滺���д��ڸ�·��������ڴ���ֱ�ӻ�ȡ��ͼƬ
if(mHashMap_caches.containsKey(path)){
bitmap = mHashMap_caches.get(path).get();
//��������е�ͼƬ�Ѿ����ͷţ���Ӹû������Ƴ�ͼƬ·��
if(bitmap == null){
mHashMap_caches.remove(path);
}else {
return bitmap;
}
}
//���������δ�õ�������Ҫ��ͼƬ������ļ��ж�ȡ��ͼƬ
//��ȡ���ļ���ͼƬ����ļ��洢·��
File dir = mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
//Log.i("info", "dir=============="+dir);
//����Ҫ��ȡ��ͼƬ·��
File file = new File(dir, path);
//���ļ��ж�ȡָ��·����ͼƬ
bitmap = BitMapTools.getBitMap(file.getAbsolutePath());
//����ļ��д��ڸ�ͼƬ����ֱ�Ӵ��ļ��л�ȡͼƬ
if(bitmap != null){
return bitmap;
}
//������������ж�δ��ȡͼƬ����ֱ�Ӵӷ�����������ͼƬ
//��������������
ImageLoadTask task = new ImageLoadTask();
//��������·��
task.path = path;
//�������������callback����
task.callback = callback;
//������������ӵ�������� ����������ѯ״̬
maArrayList_taskQueue.add(task);
//�����̣߳���ʼ����
synchronized (mThread) {
mThread.notify();
}
return null;
}
}