在平时写android程序的时候,要实现加载图片,还要考虑到系统的性能,我们需要实现图片的异步加载,这样使用缓存的和去网络下载的两种方式;
当我们有个要加载图片的请求的时候,我们先去缓存中寻找,如果缓存中没有,那就去网络上面去下载,然后再把下载到的图片放入到缓存中,最后来显示要加载的图片;
下面我是画出来的一张简
每次下载图片成功,我们都保存到缓存,但是还要考虑到一个垃圾回收的机制,系统中我们把每次图片都保存起来但是如果缓存太多了也不行;此时我们需要用到
一个软引用SoftReference类:用这个类可以来实现简单的缓存,当要响应内存需要时候,垃圾收集器会去决定是否回收该软引用对象;
这个类中包含一个方法是
public T get()
-
返回此引用对象的指示对象。如果此引用对象已经由程序或垃圾回收器清除,则此方法将返回
null
。
下面的Demo 是我今天看mars老师的异步加载图片的视频,mars老师写的,自己也好好理解了一下加载流程,现在贴出来和大家一起分享学习一下
主Activity类
- 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);
- }
- }
下面效果截图":