|  | 
 
| 复制代码* 异步加载图片
 * 使用方法:
 * private AsyncImageLoader asyImg = new AsyncImageLoader();
 * asyImg.LoadImage(productItems.get(position).getPic(), (ImageView)view.findViewById(R.id.pic));
 */
public class AsyncImageLoader {
        // 为了加快速度,在内存中开启缓存(主要应用于重复图片较多时,或者同一个图片要多次被访问,比如在ListView时来回滚动)
        public Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();
        private ExecutorService executorService = Executors.newFixedThreadPool(5); // 固定五个线程来执行任务
        private final Handler handler = new Handler();
        // SD卡上图片储存地址
        private final String path = Environment.getExternalStorageDirectory()
                        .getPath() + "/maiduo";
        /**
         * 
         * @param imageUrl
         *            图像url地址
         * @param callback
         *            回调接口
         * @return 返回内存中缓存的图像,第一次加载返回null
         */
        public Drawable loadDrawable(final String imageUrl,
                        final ImageCallback callback) {
                // 如果缓存过就从缓存中取出数据
                if (imageCache.containsKey(imageUrl)) {
                        SoftReference<Drawable> softReference = imageCache.get(imageUrl);
                        if (softReference.get() != null) {
                                return softReference.get();
                        }
                } else if (useTheImage(imageUrl) != null) {
                        return useTheImage(imageUrl);
                }
                // 缓存中没有图像,则从网络上取出数据,并将取出的数据缓存到内存中
                executorService.submit(new Runnable() {
                        public void run() {
                                try {
                                        final Drawable drawable = Drawable.createFromStream(
                                                        new URL(imageUrl).openStream(), "image.png");
                                        imageCache.put(imageUrl, new SoftReference<Drawable>(
                                                        drawable));
                                        handler.post(new Runnable() {
                                                public void run() {
                                                        callback.imageLoaded(drawable);
                                                }
                                        });
                                        saveFile(drawable, imageUrl);
                                } catch (Exception e) {
                                        throw new RuntimeException(e);
                                }
                        }
                });
                return null;
        }
        // 从网络上取数据方法
        public Drawable loadImageFromUrl(String imageUrl) {
                try {
                        return Drawable.createFromStream(new URL(imageUrl).openStream(),
                                        "image.png");
                } catch (Exception e) {
                        throw new RuntimeException(e);
                }
        }
        // 对外界开放的回调接口
        public interface ImageCallback {
                // 注意 此方法是用来设置目标对象的图像资源
                public void imageLoaded(Drawable imageDrawable);
        }
        // 引入线程池,并引入内存缓存功能,并对外部调用封装了接口,简化调用过程
        public void LoadImage(final String url, final ImageView iv) {
                if (iv.getImageMatrix() == null) {
                        iv.setImageResource(R.drawable.loading);
                }
                // 如果缓存过就会从缓存中取出图像,ImageCallback接口中方法也不会被执行
                Drawable cacheImage = loadDrawable(url,
                                new AsyncImageLoader.ImageCallback() {
                                        // 请参见实现:如果第一次加载url时下面方法会执行
                                        public void imageLoaded(Drawable imageDrawable) {
                                                iv.setImageDrawable(imageDrawable);
                                        }
                                });
                if (cacheImage != null) {
                        iv.setImageDrawable(cacheImage);
                }
        }
        /**
         * 保存图片到SD卡上
         * 
         * @param bm
         * @param fileName
         * 
         */
        public void saveFile(Drawable dw, String url) {
                try {
                        BitmapDrawable bd = (BitmapDrawable) dw;
                        Bitmap bm = bd.getBitmap();
                        // 获得文件名字
                        final String fileNa = url.substring(url.lastIndexOf("/") + 1,
                                        url.length()).toLowerCase();
                        File file = new File(path + "/image/" + fileNa);
                        // 创建图片缓存文件夹
                        boolean sdCardExist = Environment.getExternalStorageState().equals(
                                        android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
                        if (sdCardExist) {
                                File maiduo = new File(path);
                                File ad = new File(path + "/image");
                                // 如果文件夹不存在
                                if (!maiduo.exists()) {
                                        // 按照指定的路径创建文件夹
                                        maiduo.mkdir();
                                        // 如果文件夹不存在
                                } else if (!ad.exists()) {
                                        // 按照指定的路径创建文件夹
                                        ad.mkdir();
                                }
                                // 检查图片是否存在
                                if (!file.exists()) {
                                        file.createNewFile();
                                }
                        }
                        BufferedOutputStream bos = new BufferedOutputStream(
                                        new FileOutputStream(file));
                        bm.compress(Bitmap.CompressFormat.JPEG, 100, bos);
                        bos.flush();
                        bos.close();
                } catch (Exception e) {
                        // TODO: handle exception
                }
        }
        /**
         * 使用SD卡上的图片
         * 
         */
        public Drawable useTheImage(String imageUrl) {
                Bitmap bmpDefaultPic = null;
                // 获得文件路径
                String imageSDCardPath = path
                                + "/image/"
                                + imageUrl.substring(imageUrl.lastIndexOf("/") + 1,
                                                imageUrl.length()).toLowerCase();
                File file = new File(imageSDCardPath);
                // 检查图片是否存在
                if (!file.exists()) {
                        return null;
                }
                bmpDefaultPic = BitmapFactory.decodeFile(imageSDCardPath, null);
                if (bmpDefaultPic != null || bmpDefaultPic.toString().length() > 3) {
                        Drawable drawable = new BitmapDrawable(bmpDefaultPic);
                        return drawable;
                } else
                        return null;
        }
}
 | 
 |