在平时写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); 	} } 

下面效果截图":