在Android开发过程中,为了防止阻塞UI,图片加载时经常采用异步的方法来加载,异步加载图片的主要流程是进行判断缓存中是否存在图片,如果存在则直接返回,如果不存在则进行下载并进行缓存。
以下是建立一个异步下载类:
/**? *?User:?Tom? *?Date:?13-5-13? *?Time:?下午8:07? */? public?class?AsnycImageLoader?{? //定义一个HashMap进行存放缓存的Image?key为String?Value为一个弱引用的一个资源文件? //?图片?为了方便JAVA的回收? private?Map<String,?SoftReference<Drawable>>?imageCache?=?null;? public?AsnycImageLoader()?{? imageCache?=?new?HashMap<String,?SoftReference<Drawable>>();? }? /**? *?加载图片? *?<p>imageurl为下载资源的URL,? *?ImageCallback当缓存中不存在相关图片时时行网络下载? *?在多线程下要使用Handler进行操作UI?利用回调接口的方式进行更新UI? *?</p>? *?@param?imageUrl? *?@param?callback? *?@return? */? public?Drawable?loadDrawable(final?String?imageUrl,?final?ImageCallback?callback)?{? //进行判断ImageCache中是否存在缓存图片? if?(imageCache.containsKey(imageUrl))?{? SoftReference<Drawable>?softReference?=?imageCache.get(imageUrl);? if?(softReference.get()?!=?null)?{? return?softReference.get();? }? }? //定义操作UI的Handler? final?Handler?handler?=?new?Handler()?{? @Override? public?void?handleMessage(Message?msg)?{? callback.imageLoaded((Drawable)?msg.obj);? }? };? new?Thread(new?Runnable()?{? @Override? public?void?run()?{? Drawable?drawable?=?loadImageFromUrl(imageUrl);? imageCache.put(imageUrl,?new?SoftReference<Drawable>(drawable));? Message?message?=?handler.obtainMessage(0,?drawable);? handler.sendMessage(message);? }? }).start();? return?null;? }? //根据URL地址进行获取资源? protected?Drawable?loadImageFromUrl(String?imageUrl)?{? try?{? return?Drawable.createFromStream(new?URL(imageUrl).openStream(),?"src");? }?catch?(Exception?e)?{? throw?new?RuntimeException();? }? }? //回调接口? public?interface?ImageCallback?{? public?abstract?void?imageLoaded(Drawable?drawable);? }? }
主Activity:
/**? *?User:?Tom? *?Date:?13-5-13? *?Time:?下午8:33? */? public?class?LoadImage?extends?Activity?{? private?AsnycImageLoader?loader?=?null;? public?void?onCreate(Bundle?savedInstanceState)?{? super.onCreate(savedInstanceState);? setContentView(R.layout.loadimages);? loader?=?new?AsnycImageLoader();? loadImage("http://www.jb51.net/images/icon-partners.png",?R.id.image1);? loadImage("http://www.jb51.net/images/icon-dev.png",?R.id.image2);? loadImage("http://pic28.jb51.net/20130421/12302174_231210305323_2.jpg",?R.id.image3);? }? public?void?loadImage(String?url,?int?id)?{? final?ImageView?imageView?=?(ImageView)?findViewById(id);? Drawable?cacheImage?=?loader.loadDrawable(url,?new?AsnycImageLoader.ImageCallback()?{? @Override? public?void?imageLoaded(Drawable?drawable)?{? imageView.setImageDrawable(drawable);? }? });? if?(cacheImage?!=?null)?{? imageView.setImageDrawable(cacheImage);? }? }? }