package com.lgq.rssreader.cache;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.lgq.rssreader.R;
import com.lgq.rssreader.core.ReaderApp;
import com.lgq.rssreader.dal.ImageRecordDalHelper;
import com.lgq.rssreader.entity.Blog;
import com.lgq.rssreader.entity.ImageRecord;
import com.lgq.rssreader.enums.ImageType;
import com.lgq.rssreader.utils.FileHelper;
import com.lgq.rssreader.utils.NetHelper;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class AsyncImageLoader {
private HashMap<String, SoftReference<Drawable>> imageCache;
Context curContext;
private BlockingQueue<Runnable> queue = null;
private ThreadPoolExecutor executor = null;
public AsyncImageLoader() {
curContext = ReaderApp.getAppContext();
imageCache = new HashMap<String, SoftReference<Drawable>>();
queue = new LinkedBlockingQueue<Runnable>();
/**
* 线程池维护线程的最少数量2 <br>
* 线程池维护线程的最大数量10<br>
* 线程池维护线程所允许的空闲时间180秒
*/
executor = new ThreadPoolExecutor(2, 10, 180, TimeUnit.SECONDS, queue);
}
public Drawable loadDrawable(final Context context, 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;
}
}
final Handler handler = new Handler() {
public void handleMessage(Message message) {
imageCallback.imageLoaded((Drawable) message.obj, imageUrl);
}
};
// 将任务添加到线程池
executor.execute(new Runnable() {
public void run() {
// 根据URL加载图片
Drawable drawable = loadImageFromUrl(context, imageUrl);
// 图片资源不为空是创建软引用
if (null != drawable)
imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
Message message = handler.obtainMessage(0, drawable);
handler.sendMessage(message);
}
});
return null;
}
// 网络图片先下载到本地cache目录保存,以imagUrl的图片文件名保存,如果有同名文件在cache目录就从本地加载
public static Drawable loadImageFromUrl(Context context, String imageUrl) {
Drawable drawable = null;
if (imageUrl == null)
return null;
String fileName = "";
// 获取url中图片的文件名与后缀
if (imageUrl != null && imageUrl.length() != 0) {
fileName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1);
}
// 根据图片的名称创建文件(不存在:创建)
File file = new File(context.getCacheDir(), fileName);
// 如果在缓存中找不到指定图片则下载
if (!file.exists() && !file.isDirectory()) {
try {
// 从网络上下载图片并写入文件
FileOutputStream fos = new FileOutputStream(file);
InputStream is = new URL(imageUrl).openStream();
int data = is.read();
while (data != -1) {
fos.write(data);
data = is.read();
}
fos.close();
is.close();
drawable = Drawable.createFromPath(file.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
// 如果缓存中有则直接使用缓存中的图片
else {
// System.out.println(file.isDirectory() + " " + file.getName());
drawable = Drawable.createFromPath(file.toString());
}
return drawable;
}
public interface ImageCallback {
public void imageLoaded(Drawable imageDrawable, String imageUrl);
}
}