步骤1:定义图片缓存类
首先,创建一个简单的图片缓存类,用于存储和获取图片。
import android.graphics.Bitmap;
import android.util.LruCache;
public class ImageCache {
private LruCache<String, Bitmap> memoryCache;
public ImageCache() {
// 初始化内存缓存,使用 LruCache
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
int cacheSize = maxMemory / 8;
memoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount() / 1024;
}
};
}
// 从内存缓存中获取图片
public Bitmap getBitmapFromMemory(String url) {
return memoryCache.get(url);
}
// 将图片存储到内存缓存中
public void putBitmapToMemory(String url, Bitmap bitmap) {
memoryCache.put(url, bitmap);
}
}
步骤2:使用线程池加载图片
创建一个线程池,用于在后台加载图片。这样可以确保图片的加载不会阻塞主线程。
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ImageLoader {
private ImageCache imageCache = new ImageCache();
private ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
ImageLoadResult result = (ImageLoadResult) msg.obj;
result.imageView.setImageBitmap(result.bitmap);
}
};
public void displayImage(final String url, final ImageView imageView) {
final Bitmap bitmap = imageCache.getBitmapFromMemory(url);
if (bitmap != null) {
// 如果图片已经在缓存中,直接显示
imageView.setImageBitmap(bitmap);
} else {
// 如果缓存中没有,使用线程池加载图片
executorService.submit(new Runnable() {
@Override
public void run() {
Bitmap bitmap = downloadImage(url);
imageCache.putBitmapToMemory(url, bitmap);
// 将结果发送到主线程,更新ImageView
Message message = handler.obtainMessage();
message.obj = new ImageLoadResult(url, bitmap, imageView);
handler.sendMessage(message);
}
});
}
}
private Bitmap downloadImage(String url) {
// 实际的图片下载逻辑
// 这里只是一个简化的示例,实际应用中需要使用HttpURLConnection或其他网络库来下载图片
// 在这个示例中,直接返回一个占位图
return BitmapFactory.decodeResource(getResources(), R.drawable.placeholder);
}
private static class ImageLoadResult {
String url;
Bitmap bitmap;
ImageView imageView;
public ImageLoadResult(String url, Bitmap bitmap, ImageView imageView) {
this.url = url;
this.bitmap = bitmap;
this.imageView = imageView;
}
}
}
使用示例:
ImageLoader imageLoader = new ImageLoader();
imageLoader.displayImage("http://example.com/image.jpg", imageView);
这只是一个简单的图片缓存小框架的示例,实际应用中可能需要更多的功能,如磁盘缓存、图片压缩等。在实际项目中,你可能会选择使用成熟的图片加载库,如Glide或Picasso,它们提供了更多的功能和性能优化。
转载请注明出处:http://www.zyzy.cn/article/detail/15257/Android