Android实现异步加载图片

  

麦洛开通博客以来,有一段时间没有更新博文了。主要是麦洛这段时间因项目开发实在太忙了。今天周六还在公司加班,苦逼程序猿都是这样生活的。

  

今天在做项目的时候,有一个实现异步加载图片的功能,虽然比较简单但还是记录一下吧。因为麦洛之前实现异步加载图片都是使用了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实现异步加载图片