码迷,mamicode.com
首页 > 移动开发 > 详细

Android --- 简单实现三级缓存LruCache

时间:2015-09-28 22:18:26      阅读:419      评论:0      收藏:0      [点我收藏+]

标签:

  三级缓存:

    1、网络缓存 从网络获取资源

    2、本地缓存 从本地获取数据

    3、内存缓存 从内存获取数据

  内存缓存:主要是用到了LruCache这个类,这个类比较适合用来缓存图片,它会将强引用对象放在LineedHashMap中,当缓存数据大小达到预定值的时候会将在该集合中比较少使用的对象从内存中移除。

package com.itljw.zhbj.util;

import android.graphics.Bitmap;
import android.util.LruCache;

/**
 * Created by:JW
 * 创建日期:2015/9/24 19:16.
 * 描述:内存缓存
 */
public class MemoryCacheUtil {

    private LruCache<String,Bitmap> mLruCache ;

    public MemoryCacheUtil(){

        // maxMemory 是允许的最大值 ,超过这个最大值,则会回收
        long maxMemory = Runtime.getRuntime().maxMemory(); // 获取最大的可用内存 一般使用可用内存的1 / 8

        mLruCache = new LruCache<String,Bitmap>((int) maxMemory){
            /**
             * 计算每张图片的大小
             * @param key
             * @param value
             * @return
             */
            @Override
            protected int sizeOf(String key, Bitmap value) {

                int size = value.getRowBytes() * value.getHeight();

                return size;
            }
        };

    }

    /**
     * 通过url从内存中获取图片
     * @param url
     */
    public Bitmap getBitmapFromMemory(String url){
        Bitmap bitmap = mLruCache.get(url);
        return bitmap;
    }

    /**
     * 设置Bitmap到内存
     * @param url
     * @param bitmap
     */
    public void setBitmapToMemory(String url,Bitmap bitmap){
        mLruCache.put(url,bitmap); // 设置图片
    }

}

  使用对应的键和值将数据put进集合中,使用get方法再取出来

  本地缓存:将网络上获取下来的数据,保存在本地文件中

package com.itljw.zhbj.util;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.math.MathContext;

/**
 * Created by:JW
 * 创建日期:2015/9/24 15:28.
 * 描述:本地缓存
 */
public class LocalCacheUtil {

    // 文件保存路径
//    public static final String CACHE_PATH = Environment.getExternalStorageDirectory()
//            .getAbsolutePath() + "/zhbj_bitmap_cache";
//    public static final String CACHE_PATH = Environment.getExternalStorageDirectory()
//            .getAbsolutePath() + "/zhbj_bitmap_cache";


    private String CACHE_PATH;

    public LocalCacheUtil() {
        // 判断当前时候有内存卡的存在
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            // 内存卡存在
            CACHE_PATH = "/mnt/sdcard/zhbj" + "/zhbj_bitmap_cache";
        }else{
            CACHE_PATH = "/data/data/com.itljw.zhbj/files" + "/zhbj_bitmap_cache";
        }

        System.out.println("cache_path:" + CACHE_PATH);
    }


    /**
     * 设置Bitmap数据到本地
     *
     * @param url
     * @param bitmap
     */
    public void setBitmapToLocal(String url, Bitmap bitmap) {

        try {
            String fileName = MD5Utils.encode(url);

            File file = new File(CACHE_PATH, fileName);

            File parentFile = file.getParentFile();

            if (!parentFile.exists()) {
                // 如果文件不存在,则创建文件夹
                parentFile.mkdirs();
            }

            // 将图片压缩到本地 第一个参数:
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(file));


        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 通过url获取Bitmap
     *
     * @param url
     */
    public Bitmap getBitmapFromLocal(String url) {

        try {

            File file = new File(CACHE_PATH, MD5Utils.encode(url));

            if (file.exists()) {
                // 如果文件存在
                Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(file));
                return bitmap;
            }


        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

}

  网络缓存:通过url从网络上获取资源数据,通过异步AsyncTask拉取数据,同时,如果成功拉取到数据,将数据保存在本地和内存中一份。

package com.itljw.zhbj.util;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * Created by:JW
 * 创建日期:2015/9/24 14:53.
 * 描述:网络缓存
 */
public class NetCacheUtil {


    private MemoryCacheUtil mMemoryCacheUtil;
    private LocalCacheUtil mLocalCacheUtil;

    public NetCacheUtil(MemoryCacheUtil mMemoryCacheUtil, LocalCacheUtil mLocalCacheUtil) {
        this.mMemoryCacheUtil = mMemoryCacheUtil;
        this.mLocalCacheUtil = mLocalCacheUtil;
    }

    /**
     * 获取服务端数据
     *
     * @param ivPhoto
     * @param url
     */
    public void getBitmapFromInternet(ImageView ivPhoto, String url) {

        new BitmapAsyncTask().execute(ivPhoto, url); // 开启AsyncTask

    }

    /**
     * 第一个泛型:参数类型  第二个泛型:更新进度的泛型, 第三个泛型是OnPostExecute的结果
     * Object : 传入的参数类型
     * Void : 进度
     * Bitmap : 返回类型
     */
    private class BitmapAsyncTask extends AsyncTask<Object, Void, Bitmap> {

        private ImageView ivPhoto;
        private String url;

        /**
         * 运行在子线程中
         *
         * @param params
         * @return
         */
        @Override
        protected Bitmap doInBackground(Object... params) {

            ivPhoto = (ImageView) params[0]; // 获取两个参数
            url = (String) params[1];
Bitmap bitmap
= downloadBitmap(url); // 从网络上加载图片 return bitmap; } /** * 在主线程中执行 用于更新界面 * * @param bitmap */ @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); if (bitmap != null) { ivPhoto.setImageBitmap(bitmap); // 为ImageView设置图片 System.out.println("从网络获取图片..."); // 将获取到的图片加载到本地 mLocalCacheUtil.setBitmapToLocal(url, bitmap); // 将获取到的图片加载到内存 mMemoryCacheUtil.setBitmapToMemory(url, bitmap); } } } /** * 根据url从网络上获取图片 * * @param imageUrl 图片路径 * @return */ private Bitmap downloadBitmap(String imageUrl) { HttpURLConnection conn = null; try { URL url = new URL(imageUrl); conn = (HttpURLConnection) url.openConnection(); // 打开连接 conn.setReadTimeout(5000); // 设置读取超时时间 conn.setConnectTimeout(5000); // 设置连接超时时间 conn.setRequestMethod("GET"); // 设置请求方式 conn.connect(); // 开始连接 if (conn.getResponseCode() == 200) { // 访问成功 InputStream is = conn.getInputStream(); // 获取流数据 // 对图片进行压缩处理 BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; // 图片的宽高都为原来的一半 Bitmap bitmap = BitmapFactory.decodeStream(is, null, options); // 将流数据转成Bitmap对象 return bitmap; } else { // 访问失败 return null; } } catch (Exception e) { e.printStackTrace(); } finally { if (conn != null) { conn.disconnect(); // 断开连接 } } return null; } }

工具类:MyBitmapUtil

package com.itljw.zhbj.util;

import android.content.Context;
import android.graphics.Bitmap;
import android.widget.ImageView;

/**
 * Created by:JW
 * 创建日期:2015/9/24 19:52.
 * 描述:缓存工具类
 */
public class MyBitmapUtil {

    private MemoryCacheUtil mMemoryCacheUtil = null; // 内存缓存
    private LocalCacheUtil mLocalCacheUtil = null; // 本地缓存
    private NetCacheUtil mNetCacheUtil = null; // 网络缓存

    public MyBitmapUtil() {
        mMemoryCacheUtil = new MemoryCacheUtil();
        mLocalCacheUtil = new LocalCacheUtil();
        mNetCacheUtil = new NetCacheUtil(mMemoryCacheUtil, mLocalCacheUtil);
    }

    /**
     * 将图片资源设置给控件
     * @param url
     * @param ivPhoto
     */
    public void display(String url, ImageView ivPhoto) {

        Bitmap bitmap = null;

        // 1.判断内存中是否有缓存
        bitmap = mMemoryCacheUtil.getBitmapFromMemory(url); // 从内存中获取Bitmap
        if (bitmap != null) {
            ivPhoto.setImageBitmap(bitmap); // 设置图片
            System.out.println("从内存获取图片...");
            return;
        }
        // 2.判断本地是否有缓存
        bitmap = mLocalCacheUtil.getBitmapFromLocal(url); // 从本地缓存中获取Bitmap
        if (bitmap != null) {
            ivPhoto.setImageBitmap(bitmap); // 设置本地图片
            mMemoryCacheUtil.setBitmapToMemory(url, bitmap); // 设置图片到内存
            System.out.println("从本地获取图片...");
            return;
        }
        // 3.从网络获取数据

        mNetCacheUtil.getBitmapFromInternet(ivPhoto, url); // 设置图片

    }

}

 

  

    

 

Android --- 简单实现三级缓存LruCache

标签:

原文地址:http://www.cnblogs.com/android-ljwBlobs/p/4844987.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!