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

来源:互联网 发布:上海数据港代码 编辑:程序博客网 时间:2024/04/27 18:01

    

        在平时写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;}@Overridepublic 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() {@Overridepublic 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);}}

下面效果截图":




  


原创粉丝点击