`
hunankeda110
  • 浏览: 741550 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多
内容纲要



• ListView视图缓存优化
• ListView异步加载优化

• ListView图片缓存

• 内存优化

       ListView图片缓存



如果每次加载列表时,都需要从网络下载图片,不但会消耗大量

   的网络流量,而且会给用户不好的用户体验。为减少用户的

   等待时间,可以对图片进行缓存,这里主要有两种缓存方案

    :

1、临时缓存,当程序退出时,缓存会被清空。

2、本地持久化缓存,将图片保存在本地。


java] view plaincopyprint?public class AsyncImageLoader

{

private HashMap<String, SoftReference<Drawable>>

imageCache;



public AsyncImageLoader() {

imageCache = new HashMap<String,

SoftReference<Drawable>>();

}



public Drawable loadDrawable(final String imageUrl,

final ImageCallback imageCallback) {

if (imageCache.containsKey(imageUrl)) {



   SoftReference<Drawable> softReference =

   imageCache.get(imageUrl);

   Drawable drawable = softReference.get();

   if (drawable != null) {

   return drawable;

   }

   }

   final Handler handler = new Handler() {

   @Override

   public void handleMessage(Message message) {

   imageCallback.imageLoaded((Drawable) message.obj,

   imageUrl);

   }                                                                    
   SoftReference<Drawable> softReference =

   imageCache.get(imageUrl);

   Drawable drawable = softReference.get();

   if (drawable != null) {

   return drawable;

   }

   }

   final Handler handler = new Handler() {

   @Override

   public void handleMessage(Message message) {

   imageCallback.imageLoaded((Drawable) message.obj,

   imageUrl);

   }                                                                    new Thread() {

@Override

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;

}



public static Drawable loadImageFromUrl(String url) {

// ...

}



public interface ImageCallback {

public void imageLoaded(Drawable imageDrawable, String imageUrl);

                                                                       
}



• 注意这里使用了 SoftReference来缓存图片,允许 GC在需要

   的时候可以对缓存中的图片进行清理。它这样工作:



    · 调用 loadDrawable(ImageUrl, imageCallback),传入一

   个匿名实现的 ImageCallback接口



    · 如果图片在缓存中不存在的话,图片将从单一的线程中下

   载并在下载结束时通过 ImageCallback回调



    · 如果图片确实存在于缓存中,就会马上返回,不会回调

   ImageCallback

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics