Android简单实现 缓存数据

所属分类: 软件编程 / Android 阅读数: 30
收藏 0 赞 0 分享

前言

1、每一种要缓存的数据都是有对应的versionCode,通过versionCode请求网络获取是否需要更新

2、提前将要缓存的数据放入assets文件夹中,打包上线。

缓存设计

Android 缓存流程图

代码实现

/**
 * Created by huangbo on 2017/6/19.
 *
 * 主要是缓存的工具类
 *
 * 缓存设计:
 *         0.从内存中读取数据 :0.1 读取成功-> 取出versionCode ->3
 *                             0.2 读取失败-> 1
 *
 *         1.从文件中读取数据:1.1读取成成功-> 取出versionCode ->3
 *                             1.2读取失败-> 2
 *         2.从Assets中读取数据:2.1读取成功-> 取出versionCode ->3
 *                                2.2读取失败-> versionCode==0 ->3
 *
 *         3.用versionCode请求网络 3.1请求成功(有版本更新)将文件写入内存,写入文件;
 *                                 3.1 请求失败,(没有版本更新)
 *
 */

public class CacheData {

    public static CacheData cacheData;

    public static CacheData getInstance() {
        if (cacheData == null) {
            cacheData = new CacheData();
        }
        return cacheData;
    }

    String mFileName;

    public CacheData cacheName(String mFileName) {
        this.mFileName = mFileName;
        return this;
    }


    ExecutorService cachedThreadPool;

    private CacheData() {
        cachedThreadPool = Executors.newCachedThreadPool();
    }


    /**
     * 从assets 中读取文件
     *
     * @return cacheData 的Json串
     */
    private String readDataFromAssets() {
        try {
            InputStream ips = AppUtils.ApplicationContext.getAssets().open(mFileName);
            byte[] bytes = new byte[ips.available()];
            ips.read(bytes);
            ips.close();
            return new String(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    public void readDataFromAssets(final Handler handler) {
        cachedThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                String json = readDataFromAssets();
                Message message = handler.obtainMessage(1, json);
                handler.sendMessage(message);
            }
        });
    }
    public void readDataFromFile(final Handler handler) {
        cachedThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                Message message = handler.obtainMessage(1, readDataFromFile());
                handler.sendMessage(message);
            }
        });

    }

    /**
     * 将region 更新到指定文件里
     * @param
     */

    public void writeData2FileWithThread(final String Data) {
        cachedThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                writeRegion2File(Data);
            }
        });
    }

    /**
     * @return cacheData 的Json串
     */

    private String readDataFromFile() {
        try {
            File file = new File(AppUtils.getCacheDirectory(), mFileName);
            if (!file.exists()) {
                return null;
            }
            FileInputStream fis = new FileInputStream(file);
            byte[] bytes = new byte[fis.available()];
            fis.read(bytes);
            fis.close();
            return new String(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";

    }

    private void writeData2File(String jsonData) {
        try {
            File cityFile = new File(AppUtils.getCacheDirectory(), mFileName);
            if (!cityFile.exists()) {
                cityFile.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(cityFile);
            fos.write(regionJsonData.getBytes("UTF-8"));
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

使用方法

/**
 * Created by huangbo on 2017/6/8.
 */

public class Region {
    public static Region region;

    public static Region getInstance() {
        if (region == null) {
            region = new Region();
        }
        return region;
    }


    ProvinceCityBean provinceCityBean;

    public int getVersion() {
        return provinceCityBean == null ? 0 : provinceCityBean.getVersion();
    }

    public ProvinceCityBean getProvinceCityBean() {
        return provinceCityBean;
    }

    public void setProvinceCityBean(final String mRegionJson, final Handler handler) {
        if (TextUtils.isEmpty(mRegionJson)) {
            return;
        }
        cachedThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                provinceCityBean = GsonUtils.GsonToBean(mRegionJson, ProvinceCityBean.class);
                if (handler != null) {
                    handler.sendEmptyMessage(1);
                }
            }
        });
    }
    ExecutorService cachedThreadPool;
    CacheData cacheData;

    private Region() {
        cachedThreadPool = Executors.newCachedThreadPool();
        cacheData = CacheData.getInstance().cacheName(Const.REGION_JSON);
    }


    /**
     * 具体调用方法
     */
    public void cacheRegion() {
        if (provinceCityBean == null) {
            readRegionFromFile();
        } else {
            readRegionFromHttp();
        }
    }

    private void readRegionFromFile() {
        cacheData.readDataFromFile(new Handler() {
            @Override
            public void handleMessage(Message msg) {
                String jsonRegion = (String) msg.obj;
                onReadRegionFromFileBack(jsonRegion);
            }
        });
    }

    /**
     * 从文件中读取数据,若为null 继续从Asset中获取
     *
     * @param jsonRegion
     */
    private void onReadRegionFromFileBack(String jsonRegion) {
        if (!TextUtils.isEmpty(jsonRegion)) {/*文件中读取成功 设置到Region中更新json 取出version请求网络判断是否为最新的版本 */
            setProvinceCityBean(jsonRegion, httpHandler);
        } else {/*文件中读取失败  从assets 中继续读取*/
            cacheData.readDataFromAssets(new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    String jsonRegion = (String) msg.obj;
                    onReadRegionFromAssetsBack(jsonRegion);
                }
            });
        }
    }

    private void onReadRegionFromAssetsBack(String jsonRegion) {
        if (!TextUtils.isEmpty(jsonRegion)) {/*从assets中读取成功 设置到Region中更新json*/
            setProvinceCityBean(jsonRegion, httpHandler);
        } else {
            readRegionFromHttp();
        }
    }

    private void readRegionFromHttp() {
        ReqRegion reqRegion = new ReqRegion();
        reqRegion.sendRequest(false, new OnHttpResult() {
            @Override
            public void onHttpSuccess(String data) {
                setProvinceCityBean(data, null);
                cacheData.writeData2FileWithThread(data);
            }
            @Override
            public void onHttpFailure(String message) {

            }
        });
    }

    Handler httpHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            readRegionFromHttp();
        }
    };
}
Region.getInstance().cacheRegion();//实现缓存

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

更多精彩内容其他人还在看

Android异常 java.lang.IllegalStateException解决方法

这篇文章主要介绍了Android异常 java.lang.IllegalStateException解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中Split()字符串分割特殊用法案例详解

本文通过案例的形式给大家详细介绍了android中split()字符串分割特殊用法的知识,非常不错具有参考借鉴价值,感兴趣的朋友参考下
收藏 0 赞 0 分享

Android仿新浪微博启动界面或登陆界面(1)

这篇文章主要为大家详细介绍了Android仿新浪微博启动界面或登陆界面的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android仿新浪微博oauth2.0授权界面实现代码(2)

这篇文章主要为大家详细介绍了Android仿新浪微博oauth2.0授权界面实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android开发中使用sqlite实现新闻收藏和取消收藏的功能

本篇文章主要介绍了sqlite实现新闻收藏和取消收藏功能,主要涉及到oracle数据库方面的内容,对于Android开发sqlite实现收藏和取消功能感兴趣的朋友可以参考下本文
收藏 0 赞 0 分享

Android仿新浪微博分页管理界面(3)

这篇文章主要为大家详细介绍了Android仿新浪微博分页管理界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android UI自定义ListView实现下拉刷新和加载更多效果

这篇文章主要介绍了Android UI自定义ListView实现下拉刷新和加载更多效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android—基于微信开放平台v3SDK开发(微信支付填坑)

这篇文章主要介绍了Android—基于微信开放平台v3SDK开发(微信支付填坑),具有一定的参考价值,有需要的可以了解一下。
收藏 0 赞 0 分享

Android仿新浪微博自定义ListView下拉刷新(4)

这篇文章主要为大家详细介绍了Android仿新浪微博自定义ListView下拉刷新,重点介绍了Adapter的详细代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android控件之使用ListView实现时间轴效果

这篇文章主要介绍了Android基础控件之使用ListView实现时间轴效果的相关资料,本文是以查看物流信息为例,给大家介绍了listview时间轴的实现代码,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多