图片加载优化是Android应用开发中非常重要的一部分,使用图片缓存可以提高应用的性能和用户体验。下面是一个简单的图片缓存小框架的基本实现,以供你参考。

步骤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