您的位置:首页 > Web前端

Rx Preferences 简单整理

2016-05-08 14:01 375 查看


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);

      }

    };

  }


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ANDROID Rx 开源库