483
汽車大全
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