Android图片异步加载
2014-01-05 10:21
531 查看
package com.aobang.tools; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReference; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message; import android.widget.ImageView; /** * 图片异步加载工具类 * * @version V1.0 */ public class AsynImageLoader { // 图片软引用 private HashMap<String, SoftReference<Bitmap>> imageCache; // 显示图片的ImageView private HashMap<String, ImageView> imageViews; public AsynImageLoader() {// 构造 imageCache = new HashMap<String, SoftReference<Bitmap>>(); imageViews = new HashMap<String, ImageView>(); } /** * 从网络上获取图片 * * @param imageView * 显示图片的ImageView * @param imageUrl * 图片的地址 * @return 图片 */ public Bitmap loadDrawableFromNet(final ImageView imageView, final String imageUrl) { return loadDrawable(imageView, imageUrl, new LoadCallBack() { public Bitmap load(String uri) { return loadImageFromNet(uri); } }); } /** * 从本地获取图片 * * @param imageView * 显示图片的ImageView * @param imageUrl * 图片的路径 * @return 图片 */ public Bitmap loadDrawableFromLocal(final ImageView imageView, final String imageUrl) { return loadDrawable(imageView, imageUrl, new LoadCallBack() { public Bitmap load(String uri) { return loadImageFromLocal(uri); } }); } /** * 获取图片 * * @param imageView * 显示图片的ImageView * @param imageUrl * 图片路径或网络地址 * @param load * 回调方法 加载本地图片或者加载网络图片 * @return */ private Bitmap loadDrawable(final ImageView imageView, final String imageUrl, final LoadCallBack load) { // 判断软引用里是否有图片 if (imageCache.containsKey(imageUrl)) { SoftReference<Bitmap> softReference = imageCache.get(imageUrl); Bitmap bitmap = softReference.get(); if (bitmap != null) { return bitmap;// 有则返回 } } // 将为添加到图片显示集合的 ImageViwe 加入到集合 if (!imageViews.containsKey(imageUrl)) { imageViews.put(imageUrl, imageView); } final Handler handler = new Handler() { public void handleMessage(Message message) { imageViews.get(imageUrl).setImageBitmap((Bitmap) message.obj); } }; //启动线程获取图片 new Thread() { public void run() { Bitmap bitmap = load.load(imageUrl);//执行回调 imageCache.put(imageUrl, new SoftReference<Bitmap>(bitmap)); Message message = handler.obtainMessage(0, bitmap); handler.sendMessage(message); } }.start(); return null; } private interface LoadCallBack { public Bitmap load(String uri); } /** * 从网络加载图片 * * @param url * @return */ public Bitmap loadImageFromNet(String url) { URL m; InputStream i = null; try { m = new URL(url); i = (InputStream) m.getContent(); } catch (MalformedURLException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return BitmapFactory.decodeStream(i); } /** * 从本地加载图片 * * @param path * @return */ public Bitmap loadImageFromLocal(String path) { return BitmapFactory.decodeFile(path); } }
相关文章推荐
- android 异步加载图片缩略图
- Android 使用BaseAdapter实现异步图片加载
- Android学习笔记(二)之异步加载图片
- 在Android中实现ListView图片异步加载一
- Android中使用二级缓存、异步加载批量加载图片完整案例
- (4.1.21.4)Android Handler 异步消息处理机制的妙用 创建强大的图片加载类
- Android listview 异步加载图片并防止错位
- Android:ViewPager详解(异步网络加载图片,带图片缓存,并带导航小圆点)
- 图片异步加载之 Android-Universal-Image-Loader
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
- android工具类----(从网络获取图片以及异步加载图片)
- 演化理解 Android 异步加载图片
- Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
- Android异步加载图片并缓存到内存和SD卡上
- Android性能优化之实现双缓存的图片异步加载工具(LruCache+SoftReference) - 拿来即用
- Android 异步加载图片-AsyncTask
- android开发中解决ListView异步加载图片错位问题
- Android ListView异步加载图片乱序问题,原因分析及解决方案
- android中listview 异步加载防止图片移位
- Android进阶:ListView性能优化异步加载图片 使滑动效果流畅