Rx Preferences

如何使用呢?

创建:
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
RxSharedPreferences rxPreferences = RxSharedPreferences.create(preferences);
如此则生成一个RxSharedPreferences,为后续使用提供实例。

读取:
Preference<String> username = rxPreferences.getString("username");
Preference<Boolean> showWhatsNew = rxPreferences.getBoolean("show-whats-new", true);
上面是两个读取值。

检测数据改变:
username.asObservable().subscribe(new Action1<String>() {
  @Override public void call(String username) {
    Log.d(TAG, "Username: " + username);  读取到当前值
  }
}
直接存储:
RxCompoundButton.checks(showWhatsNewView)
    .subscribe(showWhatsNew.asAction());

这里是检测showWhatsNewView是否勾选,自动关联了保存。

下来我们来说说实现原理:

1创建

private xmPreferences(final SharedPreferences preferences) {
    this.preferences = preferences; //关联住创建的配置
   (1) this.keyChanges = Observable.create(new Observable.OnSubscribe<String>() {
      @Override public void call(final Subscriber<? super String> subscriber) {
        final OnSharedPreferenceChangeListener listener = new OnSharedPreferenceChangeListener() {
          @Override
          public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
            subscriber.onNext(key);  发送改变給监听着
          }
        };

preferences.registerOnSharedPreferenceChangeListener(listener);  监听配置改变

配置一个自动解耦的动作,这样在撤掉subscriber时,自动取消注册。
        subscriber.add(Subscriptions.create(new Action0() {
          @Override public void call() {
            preferences.unregisterOnSharedPreferenceChangeListener(listener);
          }
        }));
      }
    }).share();
  }
2 获取
Preference<String> username = rxPreferences.getString("username");
username.get() 可以获得值。

这里关联(1)里面的keyChanges,然后进行操作,过滤和自己的key一致的,然后再做一次map得到值,让你去检测

接口为:asObservable()

this.values = keyChanges
        .filter(new Func1<String, Boolean>() {
          @Override public Boolean call(String changedKey) {
            return key.equals(changedKey);
          }
        })
        .startWith("<init>") // Dummy value to trigger initial load.
        .onBackpressureLatest()
        .map(new Func1<String, T>() {
          @Override public T call(String ignored) {
            return get();
          }
        });

3:检测改变
自动检测属性改变,进行我们的 操作

username.asObservable().subscribe(new Action1<String>() {
  @Override public void call(String username) {
    Log.d(TAG, "Username: " + username); 
  }
}
4
 这里用了Rxbing的接口

RxCompoundButton.checks(showWhatsNewView)
    .subscribe(showWhatsNew.asAction());
showWhatsNew.asAction() 具体代码为:

这样子自动检测出来结果后,操作了set动作,存储值。
  @CheckResult @NonNull
  public Action1<? super T> asAction() {
    return new Action1<T>() {
      @Override public void call(T value) {
        set(value);
      }
    };
  }

Rx Preferences 简单整理相关推荐

  1. linux简单目录,Linux下各目录简单整理

    实习之后一直在用Linux,但是对于每个目录并不是很了解,上次阿里的面试问到了,只能靠着自己的使用经验稍作回答,不全面也不准确,所以今天简单整理一下方便以后自己查看- 1./bin 重要的二进制应用程 ...

  2. java 系统 类_JAVA系统类 System的简单整理

    对系统属性看着JDKapi做了简单的记录,尤其是文件分隔符,以及获取系统时间,数组拷贝实用比较多谢,随意正对这几个做下简单整理,需要引入junit单元测试的jar包 //获取所有系统属性 @Test ...

  3. 哪些CSS是可以被继承的--简单整理

    那些CSS是可以被继承的--简单整理 1.文本相关属性是继承的:font-size,font-family,line-height,text-index等 2.列表相关属性是继承的:list-styl ...

  4. java的栈区 堆区存放什么_简单整理java中的栈内存, 堆内存是什么?

    上一篇文章简单整理了栈(stack), 堆(heap), 队列(queue)的结构 这一篇继续整理java中的 占内存,堆内存. Java把内存划分成两种:一种是栈内存,一种是堆内存. 这里需要解释一 ...

  5. Android Camera简单整理(一)-Camera Android架构(基于Q)

    Camera整体架构简单整理 一.Android Camera整体架构简述 1.1 Android Camera 基本分层 1.2 Android Camera工作大体流程 二. Camera App ...

  6. Vue 之 vue-seamless-scroll 实现简单自动无缝滚动,且添加对应点击事件的简单整理

    Vue 之 vue-seamless-scroll 实现简单自动无缝滚动,且添加对应点击事件的简单整理 目录 Vue 之 vue-seamless-scroll 实现简单自动无缝滚动,且添加对应点击事 ...

  7. IntellJ IDEA 基础之 常用快捷键的简单整理

    IntellJ IDEA 基础之 常用快捷键的简单整理 目录 IntellJ IDEA 基础之 常用快捷键的简单整理 一.简单介绍 二.演示操作环境 二.Ctrl 1.Ctrl + F 在当前文件进行 ...

  8. Vue 之 echarts 图表数据可视化常用的一些图表/动态图表/3D图表的简单整理

    Vue 之 echarts 图表数据可视化常用的一些图表/动态图表/3D图表的简单整理 目录 Vue 之 echarts 图表数据可视化常用的一些图表/动态图表/3D图表的简单整理 一.简单介绍 二. ...

  9. Python学习记录(一)PIL库对于图像操作方法的简单整理

    Python学习记录(一)PIL库对于图像操作方法的简单整理 首先对PIL库进行一个简单的介绍:Python图像库PIL(Python Image Library)是python的第三方图像处理库,由 ...

最新文章

  1. es6 ... 添加属性_如何在10分钟内免费将HTTPS添加到您的网站,以及为什么您现在不止需要这样做......
  2. linux shell 错误 [: =: unary operator expected 解决办法
  3. #ifdef ...#else...#endif等条件编译用法
  4. boost::stl_interfaces::iterator_interface相关的测试程序
  5. 怎么看python程序卡在哪里_Python程序卡住了
  6. 【书摘001】android 底层开发技术实战详解 - 基础 - 进程管理的一些常用命令
  7. Python花式编程案例锦集(2)
  8. 成为软件高手的几个忌讳(转贴)
  9. MYSQL的两种存储引擎区别
  10. 嵌入式系统那些事—脚本语言tcl
  11. python knn模型_kNN模型(Python3.x环境)
  12. Linux文件颜色含义
  13. python模拟阴阳师抽卡
  14. docker之win安装gitlab
  15. Spring IoC 和 AOP
  16. 北航计算机学院复试专业课科目,2018北航自招复试经历总结
  17. linux 中dirname的用法
  18. 陕西黑布林滞销只是一篇营销广告,炒作夸大背后多是利益
  19. 移动安全-adb使用和提取apk文件
  20. U盘重装win10(二)刻录系统盘

热门文章

  1. CSS隐藏元素的几种方式以及display、visibility、opacity的区别
  2. Java技术体系大全,准备面试的可以参考一下!
  3. 芭蕾舞-花样年华-保利剧院
  4. 固态激光雷达与机械激光类的区别
  5. ubuntu12.04 安装 ncurses
  6. 铁威马NAS如何远程备份数据
  7. 微信红包-公众号-打击
  8. 甲、乙机之间采用方式 1 双向串行通信,具体要求如下: (1)甲机的 k1 按键可通过串行口控制乙机的 LEDI 点亮、LED2 灭,甲机的 k2 按键控制 乙机的 LED1
  9. 【武侠类网游预研】逆水寒
  10. 怪物猎人世界百度云_从怪物猎人世界上最艰难的战斗中寻找力量