麦洛开通博客以来,有一段时间没有更新博文了。主要是麦洛这段时间因项目开发实在太忙了。今天周六还在公司加班,苦逼程序猿都是这样生活的。
今天在做项目的时候,有一个实现异步加载图片的功能,虽然比较简单但还是记录一下吧。因为麦洛之前实现异步加载图片都是使用了AsynTask这个API,继续这个类,实现起来非常简单也很方便。在doInBackground()方法里实现下载逻辑。具体实现如下
<>强实现逻辑强>是:先从内存中读取,如果内存中有这张图片,则直接使用,如果内存没有再到sdcard上读取,如果有则显示,如果sdcard上还没有则到网络上读取。内存中开启缓存是参考了网上的实现。麦洛在这里非常感谢喜欢分享的程序猿们。
公共类ImageDownloader AsyncTask<延伸;字符串,整数,Object>{ 私有静态最终字符串标签=癐mageDownloader”;//为了加快速度,在内存中开启缓存(主要应用于重复图片较多时,或者同一个图片要多次被访问,比如在列表视图时来回滚动) 私人Map<字符串,SoftReference比;imageCache=new HashMap<字符串,SoftReference 在();/* * *显示图片的控件 */私人ImageView mImageView; 公共ImageDownloader (ImageView图像){ mImageView=图像; } @Override 保护空白> ImageDownloader装载机=new ImageDownloader (imageView); loader.execute (url); >之前 其实这样的话,还有一些隐患的,就是说这个类实现还是有些问题的。比如每次都在imageView中设置网络上的图片时,其实是没有使用到这个类里面的内存缓存的,就是imageCache
Map<字符串,SoftReference
比;imageCache=new HashMap<字符串,SoftReference 在();
因为每次设置imageView的时候,都是新了一个ImageDownloader的对象,所以每个ImageDownloader对象里面都是独立的一个imageCache。
另外,AsynTask也是一个线程。而每次使用都开一个线程来负载图片,对线程个数没有进行显示,毕竟线程数目还是有限制的。
所以麦洛今天发现了这个问题,于是参考了别人的实现,使用了线程池,实现逻辑也上面的代码一样,先从内存读取,如果没有到sdcard读取,如果还是没有,则是网络读取;实现没有使用AsynTask,具体代码如下:
/* * *异步加载图片,并将图片设置到ImageView控件中 */公共类ImageDownloader AsyncTask<延伸;字符串,整数,Object>{ 私有静态最终字符串标签=癐mageDownloader”;//为了加快速度,在内存中开启缓存(主要应用于重复图片较多时,或者同一个图片要多次被访问,比如在列表视图时来回滚动) 私人Map<字符串,SoftReference比;imageCache=new HashMap<字符串,SoftReference 在();/* * *显示图片的控件 */私人ImageView mImageView; 公共ImageDownloader (ImageView图像){ mImageView=图像; } @Override 保护空白> 公开课ImageUtil {/* * *图像加载程序 */静态ImageDownloader2装载机=零;/* * *加载图片 */公共静态loadImage无效(字符串url,最终ImageView ImageView) { 如果(装载机==null) { 装载机=new ImageDownloader2 (); } 加载程序。loadDrawable (url,新的ImageCallback () { @Override 公共空间imageLoaded(可拉的imageDrawable) { 如果(imageDrawable !=null) { imageView.setBackgroundDrawable (imageDrawable); } } }); } } >之前 每次在使用是需要调用ImageUtil.loadImage (url, imageView)将图片网址已经需要显示图片的控件imageView的引用传入就可以了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
Android实现异步加载图片