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