一、Android SharedPreferences 简介

众所周知,SharedPreferences是一种轻型的Android数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。它的存储位置是在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。比较经典的使用方式例如用户输入框对过往登录账户的存储。实现SharedPreferences存储的步骤如下:

1、根据Context获取SharedPreferences对象
2、利用edit()方法获取Editor对象。
3、通过Editor对象存储key-value键值对数据。
4、通过commit()或apply()方法提交数据。

commit和apply方法的区别:

1.apply没有返回值而commit返回boolean表明修改是否提交成功
2.apply是将修改数据原子提交到内存,而后异步真正提交到硬件磁盘;而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。
3.apply方法不会提示任何失败的提示。

一般的话,建议使用apply,当然,如果是需要确保数据提交成功,且有后续操作的话,则需要用commit方法。

二、Reservoir 开源库的介绍

它的中文翻译是:蓄水池; 贮液器;储藏

顾名思义,它是一个用键值对存储数据的轻量级库,官方的文档介绍是Android library to easily serialize and cache your objects to disk using key/value pairs.  规范地来说,它是一个易于序列化和缓存对象使用的键值对本地缓存库。关于SharedPreferences文章开头也有简单的描述了一下,而Reservoir可以更好的帮我们实现键值对存储数据,特别是序列化实体数据的本地缓存。

1.项目引入:

在项目build.gradle文件中配置以下代码,然后点击Sync按钮同步一下代码:

repositories {jcenter()
}
dependencies {compile 'com.anupcowkur:reservoir:3.1.0'
}

2.初始化:

在使用之前,需要初始化Reservoir ,初始化最好是在应用的Application中初始化,并设置缓存内存大小,官方写的例子是2048b, 的内存,太小了,应该改大一点。一般来说设置1-2M左右就够用了,具体大小视自己项目而定。

这里我是设置的1M:

try {Reservoir.init(this, 1024*1024); //in bytes 1M
} catch (Exception e) {//failure
}

如果想使用自己自定义的Gson 实例:

try {Reservoir.init(this, 2048, mGsonInstance);
} catch (Exception e) {//failure
}

3.Put数据,保存到本地缓存:

数据的保存有同步和异步两种方式,异步使用有两个回调方法,同步则没有。具体使用哪种方式视项目情况而定:

3.1 采取异步的方式:

//async put:
      List<String> sList = new ArrayList<String>();

      sList.add("one");
      sList.add("two");
      sList.add("three");
      Reservoir.putAsync("mKey", sList, new ReservoirPutCallback() {@Override
         public void onSuccess() {//success
         }@Override
         public void onFailure(Exception e) {//error
         }});

3.2 采取同步的方式:

//Put a simple object
      try {Reservoir.put("mKey", mObject);
      } catch (Exception e) {//failure;
      }

4.读取缓存的键值对数据:

4.1 采取异步的方式:

//Get data
      Type resultType = new TypeToken<List<String>>() {}.getType();
      Reservoir.getAsync("myKey", resultType, new ReservoirGetCallback<List<String>>() {@Override
         public void onSuccess(List<String> strings) {//success
         }@Override
         public void onFailure(Exception e) {//error
         }});

4.2 采取同步的方式:

//Get data
      Type resultType = new TypeToken<List<String>>() {}.getType();
      try {Reservoir.get("myKey", resultType);
      }catch (Exception e) {//failure}
      }

4.3 检查键值是否存在

当你想要检查某一个键值对是否存在时,可用以下代码实现:

try {boolean objectExists = Reservoir.contains("mKey");
} catch (Exception e) {
}

5.删除缓存的键值对数据:

Async delete (异步):

Reservoir.deleteAsync("mKey", new ReservoirDeleteCallback() {  @Override
   public void onSuccess(MyClass myObject) {  //success
   }    @Override
   public void onFailure(Exception e) { //error
   }});

synchronous delete(同步)

try {  Reservoir.delete("mKey");
} catch (Exception e) {    //failure
}


5.清除缓存的Reservoir 数据:

Async clear(异步):

Reservoir.clearAsync(new ReservoirClearCallback() {    @Override
   public void onSuccess() {try {assertEquals(0, Reservoir.bytesUsed());
      } catch (Exception e) {}    }    @Override
   public void onFailure(Exception e) {}
});


sync clear(同步):

try {Reservoir.clear();
} catch (Exception e) {//failure
}

RxJava下使用:

Put :

//Put a simple object
      Reservoir.putUsingObservable("myKey", myObject) returns Observable<Boolean>//Put collection
            List<String> strings = new ArrayList<String>();
      strings.add("one");
      strings.add("two");
      strings.add("three");
      Reservoir.putUsingObservable("myKey", strings) returns Observable<Boolean>

Get:

//Get a simple object
      Reservoir.getUsingObservable("myKey", MyClass.class) returns Observable<MyClass>//Get collection

      Type collectionType = new TypeToken<List<String>>() {}.getType();
      Reservoir.getUsingObservable("myKey", String.class, collectionType) returns Observable<String>

Delete:

Reservoir.deleteUsingObservable("myKey") returns Observable<Boolean>

Clear:

Reservoir.clearUsingObservable() returns Observable<Boolean>

Reservoir项目GitHub地址:   https://github.com/anupcowkur/Reservoir

Android 本地缓存开源库 Reservoir 替代SharedPreferences相关推荐

  1. Android 优秀的开源库

    前言 收集了一些比较常见的开源库,特此记录(已收录350+).另外,本文将持续更新,大家有关于Android 优秀的开源库,也可以在下面留言. 一 .基本控件 TextView HTextView 一 ...

  2. Android常用热门开源库汇总(持续更新)

    原文转载:https://www.yundashi168.com/344.html 请及时关注原文网站,因为后续持续更新都在原网站更新.请多多点赞和关注. 前言 收集了一些比较常见的开源库,特此记录( ...

  3. Android开发常用开源库

    Android 开发常用开源库 一.网络请求 二.图片加载 三.数据库 四.通讯 五.注解 六.JSON解析 七.性能优化 八.性能优化之布局分析 九.工具类 十.状态栏 十一.扫码库 十二.播放器 ...

  4. Android本地数据存储: Reservoir

    一:前言 今天做项目,准备使用本地存储,把一些数据存在本地磁盘上,比如用户名.密码这样的.其实大家都知道,这种情况最常用的就是SharedPreferences了,我也不例外,脑子里第一个想到的就是用 ...

  5. Android开发:开源库集合

    开源库大全 目录 抽屉菜单 ListView WebView SwitchButton 按钮 点赞按钮 进度条 TabLayout 图标 下拉刷新 ViewPager 图表(Chart) 菜单(Men ...

  6. android 开源图表动画,Android 图表开发开源库MPAndroidChart-Go语言中文社区

    上面是APP中实现的效果图(点击可以放大查看) 图1的效果不是用这个实现的,如果感兴趣可以参考我这篇文章  Android渐变圆环 总体来说,MPAndroidChart可能是目前Android 开发 ...

  7. android 沉浸式开源库,Android沉浸式状态栏

    关于Android沉浸式状态栏, 网上已经有很多开源库, 虽然开源库可以解决某些特定布局下的沉浸式状态栏问题, 但是遇到比较特殊的布局就无法解决了, 所以了解一下沉浸式状态栏如何实现是有必要的. 无论 ...

  8. Android最佳的开源库(四)

    2019独角兽企业重金招聘Python工程师标准>>> 网络 OkHttp:Android的HTTP客户端库. AndroidAsync:异步通信库. 通知推送 PubNub:用来处 ...

  9. android 地址选择器_48种Android开发的开源库汇总

    一.安全 1.SQLCipher Sqlite加密工具 项目地址: https://github.com/sqlcipher/sqlcipher 帮助文档: http://sqlcipher.net/ ...

最新文章

  1. 【Unity 3D】学习笔记三十六:物理引擎——刚体
  2. python对数据进行合并的函数_利用Python pandas对Excel进行合并的方法示例
  3. [loj3056][hnoi2019]多边形
  4. java商品新增怎麽弄_添加新商品时如何初始化计数器 - java
  5. python程序操作的核心_python核心编程-第五章-个人笔记
  6. Java面试题:高并发环境下,jdk7 HashMap可能出现的致命问题。注意:是在jdk7与及以下版本
  7. iplat-ui源码解读
  8. 基于lis3dh的简易倾角仪c源码_cm-23D柯尼卡美能达分光测色计色差仪CM-2300d
  9. C# 如何调用打印机打印报表
  10. powerdesigner数据字典导出模板设置
  11. Go语言的前景、优点
  12. 用于检验手机号的位数以及检验此手机中是否为中国移动的手机号
  13. React Native 程序部署至 iOS 应用商店之前需要的配置和如何生成 release 版本的 APK 包
  14. 快递单号如何批量查询呢
  15. 测试人员,如何对直播类产品的直播质量进行测试呢?
  16. 4070ti和3080性能差多少 rtx4070ti和rtx3080区别对比
  17. 无法打开登录所请求的数据库 xxx。登录失败。用户 'AAA' 登录失败。
  18. Mac下显示网页全屏快捷键
  19. Win10 / 11新电脑最简单跳过联网激活和使用本地账户登录方法
  20. shell一键安装lnmp

热门文章

  1. 帝国cms后台登录显示Table 'empirecms.***_enewsloginfail' doesn't exist
  2. 福大软工1816 · 第八次作业课堂实践
  3. 《无声告白》 读书笔记
  4. MindManager盘点——舌尖上的中国
  5. 计算机3d影视的应用程序,用电脑也能看3D电影?捡起吃灰的3D眼镜!
  6. WPF内建面板之——DockPanel详细
  7. Linux固件版本查询-二次打包
  8. android Preference以及监听事件学习
  9. 【项目】offline danmu -- 爬取bilibili弹幕并分析弹幕用户ID
  10. 工作技术点小结_webank