Chinaunix首页 | 论坛 | 博客
  • 博客访问: 53166
  • 博文数量: 48
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-12 11:48
文章分类
文章存档

2016年(48)

我的朋友

分类: Java

2016-11-14 11:28:39

wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改。分享其中关于 保存正在下载的图片URL集合和图片三种获取方式管理者,网络URL获取、内存缓存获取、外部文件缓存获取的代码供技术员学习参考使用。

点击(此处)折叠或打开

  1. package com.inuoer.util;

  2. import java.lang.ref.SoftReference;
  3. import java.util.HashMap;
  4. import java.util.HashSet;
  5. import java.util.Map;
  6. import java.util.concurrent.ExecutorService;
  7. import java.util.concurrent.Executors;

  8. import android.content.Context;
  9. import android.graphics.Bitmap;
  10. import android.os.Handler;

  11. public class AsyncImageLoader {
  12.     // 保存正在下载的图片URL集合,避免重复下载用
  13.     private static HashSet<String> sDownloadingSet;
  14.     // 软引用内存缓存
  15.     private static Map<String, SoftReference<Bitmap>> sImageCache;
  16.     // 图片三种获取方式管理者,网络URL获取、内存缓存获取、外部文件缓存获取
  17.     private static LoaderImpl impl;
  18.     // 线程池相关
  19.     private static ExecutorService sExecutorService;

  20.     // 通知UI线程图片获取ok时使用
  21.     private Handler handler;

  22.     /**
  23.      * 异步加载图片完毕的回调接口
  24.      */
  25.     public interface ImageCallback {
  26.         /**
  27.          * 回调函数
  28.          *
  29.          * @param bitmap
  30.          * : may be null!
  31.          * @param imageUrl
  32.          */
  33.         public void onImageLoaded(Bitmap bitmap, String imageUrl);
  34.     }

  35.     static {
  36.         sDownloadingSet = new HashSet<String>();
  37.         sImageCache = new HashMap<String, SoftReference<Bitmap>>();
  38.         impl = new LoaderImpl(sImageCache);
  39.     }

  40.     public AsyncImageLoader(Context context) {
  41.         handler = new Handler();
  42.         startThreadPoolIfNecessary();

  43.         String defaultDir = context.getCacheDir().getAbsolutePath();
  44.         setCachedDir(defaultDir);
  45.     }

  46.     /**
  47.      * 是否缓存图片至/data/data/package/cache/目录 默认不缓存
  48.      */
  49.     public void setCache2File(boolean flag) {
  50.         impl.setCache2File(flag);
  51.     }

  52.     /**
  53.      * 设置缓存路径,setCache2File(true)时有效
  54.      */
  55.     public void setCachedDir(String dir) {
  56.         impl.setCachedDir(dir);
  57.     }

  58.     /** 开启线程池 */
  59.     public static void startThreadPoolIfNecessary() {
  60.         if (sExecutorService == null || sExecutorService.isShutdown()
  61.                 || sExecutorService.isTerminated()) {
  62.             sExecutorService = Executors.newFixedThreadPool(3);
  63.             // sExecutorService = Executors.newSingleThreadExecutor();
  64.         }
  65.     }

  66.     /**
  67.      * 异步下载图片,并缓存到memory中
  68.      *
  69.      * @param url
  70.      * @param callback
  71.      * see ImageCallback interface
  72.      */
  73.     public void downloadImage(final String url, final ImageCallback callback) {
  74.         downloadImage(url, true, callback);
  75.     }

  76.     /**
  77.      *
  78.      * @param url
  79.      * @param cache2Memory
  80.      * 是否缓存至memory中
  81.      * @param callback
  82.      */
  83.     public void downloadImage(final String url, final boolean cache2Memory,
  84.             final ImageCallback callback) {
  85.         if (sDownloadingSet.contains(url)) {
  86. //            Log.i("AsyncImageLoader", "###该图片正在下载,不能重复下载!");
  87.             return;
  88.         }

  89.         Bitmap bitmap = impl.getBitmapFromMemory(url);
  90.         if (bitmap != null) {
  91.             if (callback != null) {
  92.                 callback.onImageLoaded(bitmap, url);
  93.             }
  94.         } else {
  95.             // 从网络端下载图片
  96.             sDownloadingSet.add(url);
  97.             sExecutorService.submit(new Runnable() {
  98.                 @Override
  99.                 public void run() {
  100.                     final Bitmap bitmap = impl.getBitmapFromUrl(url,
  101.                             cache2Memory);
  102.                     handler.post(new Runnable() {
  103.                         @Override
  104.                         public void run() {
  105.                             if (callback != null)
  106.                                 callback.onImageLoaded(bitmap, url);
  107.                             sDownloadingSet.remove(url);
  108.                         }
  109.                     });
  110.                 }
  111.             });
  112.         }
  113.     }

  114.     /**
  115.      * 预加载下一张图片,缓存至memory中
  116.      *
  117.      * @param url
  118.      */
  119.     public void preLoadNextImage(final String url) {
  120.         // 将callback置为空,只将bitmap缓存到memory即可。
  121.         downloadImage(url, null);
  122.     }

  123. }

wemall-mobile详情下载地址:

wemall官网地址:

wemall 开源微商城 ,微信商城,商城源码,三级分销,微生鲜,微水果,微外卖,微订餐---专业的o2o系统

wemall

阅读(490) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~