分享个 之前写好的 android 文件流缓存类,专门处理 ArrayList、bean。

转载麻烦声明出处:https://cloud.tencent.com/developer/user/1148436/activities

目录:

  1,前序

      2,作用

  3,特点

       4,代码

1,前序

   在开发过程中,client 和 server 数据交流一般用到 json 格式传输数据。缓存机制,是任何一个优秀的 app 都必须存在的,android 的缓存数据的方法很多,无论是文本还是图像,我这里要讲的是我自己 编写 并 一直使用的, DataInfoCache 类。

2,本类作用

   专门存储 ArrayList 种子数据,我举个 例子: List<UserInfo> mInfoBean = new ArrayList<>();  这里的 bean 种子是 UserInfo 类,处理这里信息,我们一般是在接受完 server 的数据,例如 json 后,解析完 json,再通过 setXXX() 函数来存入,再用 getXXX() 获取。 在有网络的情况下,我们可以轻易 获取数据,没有网络呢? 那么我们就应该去获取缓存的。 那么问题就来了,要获取缓存,需要满足条件:

     有网络时获取数据 ---> 先保存数据到本地,作为缓存;

     没网络时             ---> 读取本地缓存;

     目前到这里来说,本类的作用和 一般的 缓存类 没什么差别,OK,请看第三点。

3,特点

1,代码量少,通俗易懂,连带注释,不到 130 行;

2,存储时,直接 存储 List,读取时,直接读出 List , 直接用,无需 再解析。    下面举个例子

          List<UserInfo> mInfoBean = new ArrayList<>();

          saveListCache(mInfoBean,"我的缓存");   /**  存储 */

          mInfoBean = loadListCache("我的缓存"); /** 获取 */

     有没有觉得很快,我既不是 存储 json,也不是存储 文本,如果存储的是 json,读取的时候,你就还需要解析了,文本也是。

4,整页代码

     内部注释丰富,相信你决定看得懂,而且,代码量真心少啊,功能强大。

  1 package cn.share.bananacloud.common;
  2 
  3 import android.content.Context;
  4 import android.util.Log;
  5 
  6 import java.io.File;
  7 import java.io.FileInputStream;
  8 import java.io.FileOutputStream;
  9 import java.io.ObjectInputStream;
 10 import java.io.ObjectOutputStream;
 11 import java.util.ArrayList;
 12 
 13 /**
 14  * Created by Administrator(林冠宏) on 2016/1/20.
 15  *
 16  * 本类 采用泛型 广泛接受 ArrayList 直接做缓存,即是开发中经常用到的 bean;
 17  *
 18  * 使用注意: 传进来的 ArrayList 所绑定的 种子,一定要是 已经继承 Serializable 接口的;
 19  * 
 20  * 使用文本流做缓存。
 21  *
 22  */
 23 
 24 public class DataInfoCache {
 25 
 26     /** 定义一些你项目里面的 缓存文件名字 ,自定义,不要也没关系,调用函数再传入也行 */
 27 
 28     public static String  QzInfo = "Qz_List_Info";
 29     public static String  CyInfo = "Cy_List_Info";
 30     private static String DataCache = "Data_Cache_File";
 31 
 32     /**
 33      * 保存 一组 数据
 34      * @param ctx  上下文
 35      * @param data 种子
 36      * @param cacheName 缓存文件名
 37      */
 38     public static<T> void saveListCache(Context ctx, ArrayList<T> data,String cacheName) {
 39         new DataCache<T>().saveGlobal(ctx, data, cacheName);
 40     }
 41 
 42     /**
 43      * 直接根据 缓存文件名获取
 44      * */
 45     public static<T> ArrayList<T> loadListCache(Context ctx,String cacheName) {
 46         return new DataCache<T>().loadGlobal(ctx,cacheName);
 47     }
 48 
 49     /**
 50      * 获取 一组 数据
 51      * @param <T> 数据缓存 save or load
 52      */
 53     static class DataCache<T> {
 54         public void save(Context ctx, ArrayList<T> data, String name) {
 55             save(ctx, data, name, "");
 56         }
 57 
 58         public void saveGlobal(Context ctx, ArrayList<T> data, String name) {
 59             save(ctx, data, name, DataCache);
 60         }
 61 
 62         private void save(Context ctx, ArrayList<T> data, String name,String folder) {
 63             if (ctx == null) {
 64                 return;
 65             }
 66             File file;
 67             if (!folder.isEmpty()) {
 68                 File fileDir = new File(ctx.getFilesDir(), folder);
 69                 if (!fileDir.exists() || !fileDir.isDirectory()) {
 70                     fileDir.mkdir();
 71                 }
 72                 file = new File(fileDir, name);
 73             } else {
 74                 file = new File(ctx.getFilesDir(), name);
 75             }
 76             if (file.exists()) {
 77                 file.delete();
 78             }
 79             Log.d("zzzzz", file.getAbsolutePath());
 80             try {
 81                 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
 82                 oos.writeObject(data);
 83                 oos.close();
 84             } catch (Exception e) {
 85                 e.printStackTrace();
 86             }
 87         }
 88 
 89         public ArrayList<T> load(Context ctx, String name) {
 90             return load(ctx, name, "");
 91         }
 92 
 93         public ArrayList<T> loadGlobal(Context ctx, String name) {
 94             return load(ctx, name, DataCache);
 95         }
 96 
 97         private ArrayList<T> load(Context ctx, String name, String folder) {
 98             ArrayList<T> data = null;
 99 
100             File file;
101             if (!folder.isEmpty()) {
102                 File fileDir = new File(ctx.getFilesDir(), folder);
103                 if (!fileDir.exists() || !fileDir.isDirectory()) {
104                     fileDir.mkdir();
105                 }
106                 file = new File(fileDir, name);
107             } else {
108                 file = new File(ctx.getFilesDir(), name);
109             }
110             Log.d("zzzzz","file "+file.getAbsolutePath());
111             if (file.exists()) {
112                 try {
113                     Log.d("zzzzz","write object");
114                     ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
115                     data = (ArrayList<T>) ois.readObject();
116                     ois.close();
117                 } catch (Exception e) {
118                     Log.d("zzzzz",e.toString());
119                 }
120             }
121             if (data == null) {     /** 如果没有 */
122                 Log.d("zzzzz","data == null");
123                 data = new ArrayList<T>();
124             }
125             return data;
126         }
127     }
128 }

打完收工,麻烦点个赞。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术记录

shiro权限控制(二):分布式架构中shiro的实现

前言: 前段时间在搭建公司游戏框架安全验证的时候,就想到之前web最火的shiro框架,虽然后面实践发现在netty中不太适用,最后自己模仿shiro写了一个缩...

4537
来自专栏郭耀华‘s Blog

android 一些常用的功能方法代码块

我们这些苦逼的程序员在工作中,每一个老板都希望我们都能把手头的工作做好的,而且是越快越好,那我们要怎么样才能快起来呢?对于开发中常用的代码块无限复做是我们工作...

2384
来自专栏Hellovass 的博客

魔改 TypeAdapterFactory

感慨:Retrofit2 虽好,但是,有时候总感觉 Java 这门语言还是美中不足啊!

721
来自专栏日常分享

Java 实现一个带提醒的定时器

定时闹钟预览版EXE下载链接:https://files.cnblogs.com/files/rekent/ReadytoRelax_jar.zip

911
来自专栏androidBlog

Android Hook 机制之简单实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

1451
来自专栏码匠的流水账

聊聊eureka server的response cache

eureka-core-1.8.8-sources.jar!/com/netflix/eureka/resources/ApplicationResource....

643
来自专栏緣來來來

安卓基础干货(二):安卓测试以及解析

461
来自专栏Jack的Android之旅

刨解OkHttp框架

继AsyncTask,又把手术刀指向OkHttp,有时候解析源码会上瘾。因为源码里包含的东西仿佛就是组成计算机世界的砖头,水分,只要有这些东西,就可以保罗万物,...

822
来自专栏Lambda

spring AOP日志管理

Spring AOP 完成日志记录 SpringAOPAspectJsecurity日志记录 Spring AOP 完成日志记录 1、技术目标 掌握S...

2846
来自专栏流柯技术学院

testng对失败时截图处理

 3.也就是说我们只需要在onTestFailure方法里面调用ScreenShot类里面的takeScreenshot方法即可,但是我们注意到ScreenSh...

981

扫码关注云+社区