一、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




更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android(安卓)数据库框架ormlite(一)
  4. Android(安卓)自定义dialog,实现右上角显示一个控件按钮
  5. 使用Android(安卓)Studio开发一个简易的音乐播放器
  6. xUtils 源码解析
  7. Android中关于Volley的使用(二)加载Json数据
  8. Android中BaseFragment封装多状态视图显示
  9. Android中post请求传递json数据给服务端

随机推荐

  1. Android studio 学习资料汇总
  2. 【从头学android】在两个Activity之间实
  3. android 按返回退出应用
  4. NDK官方开发指南翻译之 CPU_ARM_Neon
  5. android剪切板
  6. Android HapticFeedback触感反馈
  7. Android常用语句收集
  8. android 模拟器获得root 权限
  9. android 8.1 mtk fota差分包指令
  10. RelativeLayoutd 的属性