android圖片異步加載到本地
package com.example.health.util;
import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.util.Log;
public class AsyncImageLoader {
//保存正在下載的圖片URL集合,避免重複下載用
private static HashSet<String> sDownloadingSet;
//軟引用內存緩存
private static Map<String,SoftReference<Bitmap>> sImageCache;
//圖片三種獲取方式管理者,網絡URL獲取、內存緩存獲取、外部文件緩存獲取
private static LoaderImpl impl;
//線程池相關
private static ExecutorService sExecutorService;
//通知UI線程圖片獲取ok時使用
private Handler handler;
/**
* 異步加載圖片完畢的回調接口
*/
public interface ImageCallback{
/**
* 回調函數
* @param bitmap: may be null!
* @param imageUrl
*/
public void onImageLoaded(Bitmap bitmap, String imageUrl);
}
static{
sDownloadingSet = new HashSet<String>();
sImageCache = new HashMap<String,SoftReference<Bitmap>>();
impl = new LoaderImpl(sImageCache);
}
public AsyncImageLoader(Context context){
handler = new Handler();
startThreadPoolIfNecessary();
String defaultDir = context.getCacheDir().getAbsolutePath();
setCachedDir(defaultDir);
}
/**
* 是否緩存圖片至/data/data/package/cache/目錄
* 默認不緩存
*/
public void setCache2File(boolean flag){
impl.setCache2File(flag);
}
/**
* 設置緩存路徑,setCache2File(true)時有效
*/
public void setCachedDir(String dir){
impl.setCachedDir(dir);
}
/**開啟線程池*/
public static void startThreadPoolIfNecessary(){
if(sExecutorService == null || sExecutorService.isShutdown() || sExecutorService.isTerminated()){
sExecutorService = Executors.newFixedThreadPool(3);
//sExecutorService = Executors.newSingleThreadExecutor();
}
}
/**
* 異步下載圖片,並緩存到memory中
* @param url
* @param callback see ImageCallback interface
*/
public void downloadImage(final String url, final ImageCallback callback){
downloadImage(url, true, callback);
}
/**
*
* @param url
* @param cache2Memory 是否緩存至memory中
* @param callback
*/
public void downloadImage(final String url, final boolean cache2Memory, final ImageCallback callback){
if(sDownloadingSet.contains(url)){
Log.i("AsyncImageLoader", "###該圖片正在下載,不能重複下載!");
return;
}
Bitmap bitmap = impl.getBitmapFromMemory(url);
if(bitmap != null){
if(callback != null){
callback.onImageLoaded(bitmap, url);
}
}else{
//從網絡端下載圖片
sDownloadingSet.add(url);
sExecutorService.submit(new Runnable(){
@Override
public void run() {
final Bitmap bitmap = impl.getBitmapFromUrl(url, cache2Memory);
handler.post(new Runnable(){
@Override
public void run(){
if(callback != null)
callback.onImageLoaded(bitmap, url);
sDownloadingSet.remove(url);
}
});
}
});
}
}
/**
* 預加載下一張圖片,緩存至memory中
* @param url
*/
public void preLoadNextImage(final String url){
//將callback置為空,隻將bitmap緩存到memory即可。
downloadImage(url, null);
}
}
private void showImage(String imgUrl) {
if(null==LoadingActivity.userList) {
image.setImageResource(images[2]);
} else {
//for test
AsyncImageLoader loader = new AsyncImageLoader(getApplicationContext());
//將圖片緩存至外部文件中
loader.setCache2File(false); //false
//設置外部緩存文件夾
loader.setCachedDir(this.getCacheDir().getAbsolutePath());
//下載圖片,第二個參數是否緩存至內存中
loader.downloadImage(imgUrl, true/*false*/, new AsyncImageLoader.ImageCallback() {
@Override
public void onImageLoaded(Bitmap bitmap, String imageUrl) {
if(bitmap != null){
image.setImageBitmap(bitmap);
}else{
//下載失敗,設置默認圖片
image.setImageResource(images[2]);
}
}
});
}
}
最後更新:2017-04-03 16:49:00