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 callbacksee 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(){@Overridepublic void run() {final Bitmap bitmap = impl.getBitmapFromUrl(url, cache2Memory);handler.post(new Runnable(){@Overridepublic 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]);    }    }    });        }    }


更多相关文章

  1. Android(安卓)获取本地图片
  2. android BitmapUtils
  3. android 截图方法
  4. android获取手机通讯录
  5. Android中常用工具类
  6. Layer_list(层叠图片)
  7. 三级缓存图片类
  8. 获取sd卡容量
  9. 47 Android(安卓)fragment 接口回调

随机推荐

  1. 浅谈mysql执行过程以及顺序
  2. mysql 8.0.24版本安装配置方法图文教程
  3. MySQL 如何分析查询性能
  4. mysql 8.0.24 安装配置方法图文教程
  5. 如何用Navicat操作MySQL
  6. MySQL EXPLAIN输出列的详细解释
  7. MySQL 分页查询的优化技巧
  8. MySql学习笔记之事务隔离级别详解
  9. MySQL 分组查询的优化方法
  10. JDBC连接的六步实例代码(与mysql连接)