AndroidStudio利用DiskLruCache和LruCache实现简单的照片墙

来源:互联网 发布:百姓自动发帖软件 编辑:程序博客网 时间:2024/06/05 19:35

(1)主界面是一个GridView, 主要机制都实现在gridview中.

(2)核心成员

//记录下载任务
private Set<BitmapWorkerTask> taskCollection;


//内存缓存
private LruCache<String, Bitmap> mMemoryCache;

//硬盘缓存
private DiskLruCache mDiskLruCache;

(3)实现过程

<1>在adaper中对LruCache和DiskLruCache进行初始化:

        // 获取应用程序最大可用内存        int maxMemory = (int) Runtime.getRuntime().maxMemory();        int cacheSize = maxMemory / 8;  //134217728byte = 128M        // 设置图片缓存大小为程序最大可用内存的1/8        mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {            @Override            protected int sizeOf(String key, Bitmap bitmap) {                return bitmap.getByteCount();            }        };        try {            // 获取图片缓存路径            File cacheDir = getDiskCacheDir(context, "thumb");            if (!cacheDir.exists()) {                cacheDir.mkdirs();            }            // 创建DiskLruCache实例,初始化缓存数据            mDiskLruCache = DiskLruCache                    //缓存地址, 版本号(当版本号变化会自动清理缓存的), 一个key对应几个文件, 缓存容量                    .open(cacheDir, getAppVersion(context), 1, 10 * 1024 * 1024);//10M        } catch (IOException e) {            e.printStackTrace();        }

<2>在getview中进行image关联, 先设置一个空照片, 当下载之后, 利用图片的url作为tag找个这个imageview进行更新.
        imageView.setTag(url);        imageView.setImageResource(R.drawable.empty_photo);        loadBitmaps(imageView, url);
<3>加载图片

a.创建一个下载图片的AsyncTask<String, Void, Bitmap>, 参数是url, 空, 返回类型.

b.在这里进行图片下载, 下载的过程实际是将网上图片保存到硬盘缓存的过程,下载完成之后 将文件保存到内存缓存中, 同时将下载
任务从taskset中取出.下载成功的task不需要监控了.
c.硬盘缓存的key是图片url的hash值, 因为直接用url当文件名可能有非法字符. 内存缓存就可以直接用url当key了.
d.下载完成从内存缓存中取出image,设置到imageview上就可以了
            ImageView imageView = (ImageView) mphotowall.findViewWithTag(imageUrl);            if (imageView != null && bitmap != null) {                imageView.setImageBitmap(bitmap);            }            taskCollection.remove(this);        }
源码下载:点击打开链接

阅读全文
0 0
原创粉丝点击