【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2073|回复: 0

Android异步加载图片并缓存到内存和SD卡上

[复制链接]
发表于 2013-2-6 21:10:31 | 显示全部楼层 |阅读模式
  1. * 异步加载图片
  2. * 使用方法:
  3. * private AsyncImageLoader asyImg = new AsyncImageLoader();
  4. * asyImg.LoadImage(productItems.get(position).getPic(), (ImageView)view.findViewById(R.id.pic));
  5. */

  6. public class AsyncImageLoader {
  7.         // 为了加快速度,在内存中开启缓存(主要应用于重复图片较多时,或者同一个图片要多次被访问,比如在ListView时来回滚动)
  8.         public Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();
  9.         private ExecutorService executorService = Executors.newFixedThreadPool(5); // 固定五个线程来执行任务
  10.         private final Handler handler = new Handler();
  11.         // SD卡上图片储存地址
  12.         private final String path = Environment.getExternalStorageDirectory()
  13.                         .getPath() + "/maiduo";

  14.         /**
  15.          *
  16.          * @param imageUrl
  17.          *            图像url地址
  18.          * @param callback
  19.          *            回调接口
  20.          * @return 返回内存中缓存的图像,第一次加载返回null
  21.          */
  22.         public Drawable loadDrawable(final String imageUrl,
  23.                         final ImageCallback callback) {
  24.                 // 如果缓存过就从缓存中取出数据
  25.                 if (imageCache.containsKey(imageUrl)) {
  26.                         SoftReference<Drawable> softReference = imageCache.get(imageUrl);
  27.                         if (softReference.get() != null) {
  28.                                 return softReference.get();
  29.                         }
  30.                 } else if (useTheImage(imageUrl) != null) {
  31.                         return useTheImage(imageUrl);
  32.                 }
  33.                 // 缓存中没有图像,则从网络上取出数据,并将取出的数据缓存到内存中
  34.                 executorService.submit(new Runnable() {
  35.                         public void run() {
  36.                                 try {
  37.                                         final Drawable drawable = Drawable.createFromStream(
  38.                                                         new URL(imageUrl).openStream(), "image.png");
  39.                                         imageCache.put(imageUrl, new SoftReference<Drawable>(
  40.                                                         drawable));
  41.                                         handler.post(new Runnable() {
  42.                                                 public void run() {
  43.                                                         callback.imageLoaded(drawable);
  44.                                                 }
  45.                                         });
  46.                                         saveFile(drawable, imageUrl);
  47.                                 } catch (Exception e) {
  48.                                         throw new RuntimeException(e);
  49.                                 }
  50.                         }
  51.                 });
  52.                 return null;
  53.         }

  54.         // 从网络上取数据方法
  55.         public Drawable loadImageFromUrl(String imageUrl) {
  56.                 try {

  57.                         return Drawable.createFromStream(new URL(imageUrl).openStream(),
  58.                                         "image.png");
  59.                 } catch (Exception e) {
  60.                         throw new RuntimeException(e);
  61.                 }
  62.         }

  63.         // 对外界开放的回调接口
  64.         public interface ImageCallback {
  65.                 // 注意 此方法是用来设置目标对象的图像资源
  66.                 public void imageLoaded(Drawable imageDrawable);
  67.         }

  68.         // 引入线程池,并引入内存缓存功能,并对外部调用封装了接口,简化调用过程
  69.         public void LoadImage(final String url, final ImageView iv) {
  70.                 if (iv.getImageMatrix() == null) {
  71.                         iv.setImageResource(R.drawable.loading);
  72.                 }
  73.                 // 如果缓存过就会从缓存中取出图像,ImageCallback接口中方法也不会被执行
  74.                 Drawable cacheImage = loadDrawable(url,
  75.                                 new AsyncImageLoader.ImageCallback() {
  76.                                         // 请参见实现:如果第一次加载url时下面方法会执行
  77.                                         public void imageLoaded(Drawable imageDrawable) {
  78.                                                 iv.setImageDrawable(imageDrawable);
  79.                                         }
  80.                                 });
  81.                 if (cacheImage != null) {
  82.                         iv.setImageDrawable(cacheImage);
  83.                 }
  84.         }

  85.         /**
  86.          * 保存图片到SD卡上
  87.          *
  88.          * @param bm
  89.          * @param fileName
  90.          *
  91.          */
  92.         public void saveFile(Drawable dw, String url) {
  93.                 try {
  94.                         BitmapDrawable bd = (BitmapDrawable) dw;
  95.                         Bitmap bm = bd.getBitmap();

  96.                         // 获得文件名字
  97.                         final String fileNa = url.substring(url.lastIndexOf("/") + 1,
  98.                                         url.length()).toLowerCase();
  99.                         File file = new File(path + "/image/" + fileNa);
  100.                         // 创建图片缓存文件夹
  101.                         boolean sdCardExist = Environment.getExternalStorageState().equals(
  102.                                         android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
  103.                         if (sdCardExist) {
  104.                                 File maiduo = new File(path);
  105.                                 File ad = new File(path + "/image");
  106.                                 // 如果文件夹不存在
  107.                                 if (!maiduo.exists()) {
  108.                                         // 按照指定的路径创建文件夹
  109.                                         maiduo.mkdir();
  110.                                         // 如果文件夹不存在
  111.                                 } else if (!ad.exists()) {
  112.                                         // 按照指定的路径创建文件夹
  113.                                         ad.mkdir();
  114.                                 }
  115.                                 // 检查图片是否存在
  116.                                 if (!file.exists()) {
  117.                                         file.createNewFile();
  118.                                 }
  119.                         }

  120.                         BufferedOutputStream bos = new BufferedOutputStream(
  121.                                         new FileOutputStream(file));
  122.                         bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
  123.                         bos.flush();
  124.                         bos.close();
  125.                 } catch (Exception e) {
  126.                         // TODO: handle exception
  127.                 }
  128.         }

  129.         /**
  130.          * 使用SD卡上的图片
  131.          *
  132.          */
  133.         public Drawable useTheImage(String imageUrl) {

  134.                 Bitmap bmpDefaultPic = null;

  135.                 // 获得文件路径
  136.                 String imageSDCardPath = path
  137.                                 + "/image/"
  138.                                 + imageUrl.substring(imageUrl.lastIndexOf("/") + 1,
  139.                                                 imageUrl.length()).toLowerCase();
  140.                 File file = new File(imageSDCardPath);
  141.                 // 检查图片是否存在
  142.                 if (!file.exists()) {
  143.                         return null;
  144.                 }
  145.                 bmpDefaultPic = BitmapFactory.decodeFile(imageSDCardPath, null);

  146.                 if (bmpDefaultPic != null || bmpDefaultPic.toString().length() > 3) {
  147.                         Drawable drawable = new BitmapDrawable(bmpDefaultPic);
  148.                         return drawable;
  149.                 } else
  150.                         return null;
  151.         }

  152. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-11-23 19:09

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表