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

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

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

下面我是画出来的一张简

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

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

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

这个类中包含一个方法是

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


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


主Activity类

package cn.edu.nuc.image; import android.app.Activity; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.widget.ImageView; public class MainActivity extends Activity { /** Called when the activity is first created. */ private AsyncImageLoader loader = new AsyncImageLoader(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); loadImage("http://www.android.com/images/icon-partners.png", R.id.imageView01); loadImage("http://www.android.com/images/icon-dev.png", R.id.imageView02); loadImage("http://www.android.com/images/icon-market.png", R.id.imageView03); } //url:下载图片的URL //id:ImageView控件的ID private void loadImage(final String url, final int id) { // 如果缓存过就会从缓存中取出图像,ImageCallback接口中方法也不会被执行 ImageView imageView = (ImageView)findViewById(id); CallbackImpl callbackImpl = new CallbackImpl(imageView); Drawable cacheImage = loader.loadDrawable(url, callbackImpl); if (cacheImage != null) { imageView.setImageDrawable(cacheImage); } } }
回调类:

package cn.edu.nuc.image; import android.graphics.drawable.Drawable; import android.widget.ImageView; public class CallbackImpl implements AsyncImageLoader.ImageCallback{ private ImageView imageView ; public CallbackImpl(ImageView imageView) { super(); this.imageView = imageView; } @Override public void imageLoaded(Drawable imageDrawable) { imageView.setImageDrawable(imageDrawable); } }
异步加载图片类

package cn.edu.nuc.image; import java.lang.ref.SoftReference; import java.net.URL; import java.util.HashMap; import java.util.Map; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; //该类的主要作用是实现图片的异步加载 public class AsyncImageLoader { // 图片缓存对象 // 键是图片的URL,值是一个SoftReference对象,该对象指向一个Drawable对象 private Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>(); // 实现图片的异步加载 public Drawable loadDrawable(final String imageUrl, final ImageCallback callback) { // 查询缓存,查看当前需要下载的图片是否已经存在于缓存当中 if (imageCache.containsKey(imageUrl)) { SoftReference<Drawable> softReference = imageCache.get(imageUrl); if (softReference.get() != null) { return softReference.get(); } } final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { callback.imageLoaded((Drawable) msg.obj); } }; // 新开辟一个线程,该线程用于进行图片的下载 new Thread() { 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 { // 根据图片的URL,下载图片,并生成一个Drawable对象 return Drawable.createFromStream(new URL(imageUrl).openStream(), "src"); } catch (Exception e) { throw new RuntimeException(e); } } // 回调接口 public interface ImageCallback { public void imageLoaded(Drawable imageDrawable); } }

下面效果截图":



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