内容纲要
• 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
• 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