Android中实现图片的异步加载学习笔记

 在平时写android程序的时候,要实现加载图片,还要考虑到系统的性能,我们需要实现图片的异步加载,这样使用缓存的和去网络下载的两种方式;

       当我们有个要加载图片的请求的时候,我们先去缓存中寻找,如果缓存中没有,那就去网络上面去下载,然后再把下载到的图片放入到缓存中,最后来显示要加载的图片;

 下面我是画出来的一张简

      

           每次下载图片成功,我们都保存到缓存,但是还要考虑到一个垃圾回收的机制,系统中我们把每次图片都保存起来但是如果缓存太多了也不行;此时我们需要用到

一个软引用SoftReference类:用这个类可以来实现简单的缓存,当要响应内存需要时候,垃圾收集器会去决定是否回收该软引用对象;

         这个类中包含一个方法是

 public T get()
返回此引用对象的指示对象。如果此引用对象已经由程序或垃圾回收器清除,则此方法将返回 null


下面的Demo 是我今天看mars老师的异步加载图片的视频,mars老师写的,自己也好好理解了一下加载流程,现在贴出来和大家一起分享学习一下


主Activity类


回调类:

  1. package cn.edu.nuc.image;  
  2.   
  3. import android.graphics.drawable.Drawable;  
  4. import android.widget.ImageView;  
  5.   
  6. public class CallbackImpl implements AsyncImageLoader.ImageCallback{  
  7.     private ImageView imageView ;  
  8.       
  9.     public CallbackImpl(ImageView imageView) {  
  10.         super();  
  11.         this.imageView = imageView;  
  12.     }  
  13.   
  14.     @Override  
  15.     public void imageLoaded(Drawable imageDrawable) {  
  16.         imageView.setImageDrawable(imageDrawable);  
  17.     }  
  18.   
  19. }  

异步加载图片类

  1. package cn.edu.nuc.image;  
  2.   
  3. import java.lang.ref.SoftReference;  
  4. import java.net.URL;  
  5. import java.util.HashMap;  
  6. import java.util.Map;  
  7.   
  8. import android.graphics.drawable.Drawable;  
  9. import android.os.Handler;  
  10. import android.os.Message;  
  11.   
  12. //该类的主要作用是实现图片的异步加载   
  13. public class AsyncImageLoader {  
  14.     // 图片缓存对象   
  15.     // 键是图片的URL,值是一个SoftReference对象,该对象指向一个Drawable对象   
  16.     private Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();  
  17.   
  18.     // 实现图片的异步加载   
  19.     public Drawable loadDrawable(final String imageUrl,  
  20.             final ImageCallback callback) {  
  21.         // 查询缓存,查看当前需要下载的图片是否已经存在于缓存当中   
  22.         if (imageCache.containsKey(imageUrl)) {  
  23.             SoftReference<Drawable> softReference = imageCache.get(imageUrl);  
  24.             if (softReference.get() != null) {  
  25.                 return softReference.get();  
  26.             }  
  27.         }  
  28.   
  29.         final Handler handler = new Handler() {  
  30.             @Override  
  31.             public void handleMessage(Message msg) {  
  32.                 callback.imageLoaded((Drawable) msg.obj);  
  33.             }  
  34.         };  
  35.         // 新开辟一个线程,该线程用于进行图片的下载   
  36.         new Thread() {  
  37.             public void run() {  
  38.                 Drawable drawable = loadImageFromUrl(imageUrl);  
  39.                 // 然后把图片放入缓存当中   
  40.                 imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));  
  41.                 Message message = handler.obtainMessage(0, drawable);  
  42.                 handler.sendMessage(message);  
  43.             };  
  44.         }.start();  
  45.         return null;  
  46.     }  
  47.   
  48.     // 该方法用于根据图片的URL,从网络上下载图片   
  49.     protected Drawable loadImageFromUrl(String imageUrl) {  
  50.         try {  
  51.             // 根据图片的URL,下载图片,并生成一个Drawable对象   
  52.             return Drawable.createFromStream(new URL(imageUrl).openStream(),  
  53.                     "src");  
  54.   
  55.         } catch (Exception e) {  
  56.             throw new RuntimeException(e);  
  57.         }  
  58.     }  
  59.   
  60.     // 回调接口   
  61.     public interface ImageCallback {  
  62.         public void imageLoaded(Drawable imageDrawable);  
  63.     }  
  64. }  

下面效果截图":




  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值