RxObject - Rx版的 LiveData
此文章不允许转载, 违者必究...
目的:
目录:
- content
<!-- Markdown 目录语法 --><!-- Vue 目录组件 -->First, What is Android Architecture Components ?
Android Architecture Components
A collection of libraries that help you design robust, testable, and maintainable apps. Start with classes for managing your UI component lifecycle and handling data persistence.
Manage your app's lifecycle with ease
New lifecycle-aware components help you manage your activity and fragment lifecycles. Survive configuration changes, avoid memory leaks and easily load data into your UI using LiveData, ViewModel, >> LifecycleObserver and LifecycleOwner.
另外,为了看懂下面的内容, 你需要先学习这3个玩意:
- LiveData - Android Architecture Components 此文的主角, 它是这个 Android Architecture Components 的其中一个重要组成部分.
- Rxjava2
- Rxlifecycle2
编写 RxJava2 版的 LiveData
为什么不直接用 LiveData, 非得要写个 Rx 版的?
LiveData 是什么, 可以干什么?
LiveData =
Live+DataData部分在 Android 里代表着应用数据. 每当它自身发生变化时都会往外发更新通知. 界面层收到通知后会作出更新的反应.Live部分指的是 Android 里 Activity 的生明周期. 它可以通过 Lifecycle - Android Architecture Components (另外一个组成部分) 监听到 Activity 的生明周期从而按照某种google预先定义的规则, 选择性地去发通知or不发通知or延迟发通知.本人非得要写个 Rx 版的原因:
RxObject 源代码
import com.example.myproduct.lib.common.utils.log.Log;
import java.util.concurrent.TimeUnit;
import io.reactivex.Flowable;
import io.reactivex.functions.Consumer;
import io.reactivex.processors.BehaviorProcessor;
import io.reactivex.processors.FlowableProcessor;
/**
* @author Guang1234567
* @date 2017/12/7 17:28
*/
public class RxObject<V> {
private V mValue;
private final FlowableProcessor<V> mValueChanged;
public RxObject() {
this(null);
}
public RxObject(V value) {
mValue = value;
if (value != null) {
mValueChanged = BehaviorProcessor.createDefault(value).toSerialized();
} else {
mValueChanged = BehaviorProcessor.<V>create().toSerialized();
}
}
public Flowable<V> getter() {
synchronized (mValue) {
return Flowable.just(mValue);
}
}
public V get() {
synchronized (mValue) {
return mValue;
}
}
public Consumer<V> setter() {
return new Consumer<V>() {
@Override
public void accept(V value) throws Exception {
set(value);
}
};
}
public void set(V newValue) {
synchronized (mValue) {
mValue = newValue;
mValueChanged.onNext(newValue);
}
}
public Flowable<V> valueChanged() {
return mValueChanged.hide();
}
@Override
protected void finalize() throws Throwable {
super.finalize();
mValueChanged.onComplete();
}
}使用方法
class Demo {
public Demo() {
RxObject<Long> rxObj = new RxObject<>(-1L);
// 输入 : 不停改变 rxObj instance 的值.
Flowable.interval(0, 1, TimeUnit.SECONDS)
.take(10)
.subscribe(rxObj.setter());
// 输出 : 监听 rxObj instance 的值变化
rxObj.valueChanged().blockingForEach(new Consumer<Long>() {
@Override
public void accept(Long aLong) {
Log.d("RxObject_Demo", String.valueOf(aLong));
}
});
}
}RxObject 如何管理其生命周期?
下面的代码示例描述的是这么一种场景:
在 XXX_ViewModel (View Model 层) 监听数据库(Model 层)的变化, 并且把变化的数据广播到 XXX_Activity (View 层).
同时借助 Trello 团队出品的 Rxlifecycle2 库 去进行生命周期的管理, 详见 .compose(bindUntilEvent(ActivityEvent.PAUSE))
代码示例:
class XXX_ViewModel {
private RxObject<Long> mData = new RxObject(Long.valueOf(-1L));
public XXX_ViewModel {
// 监听数据库的变化, 并改变 mData 的值
database.onChanged()
.subscribe(mData.setter());
}
public RxObject<Long> getData() {
return mData;
}
}
class XXX_Activity {
private TextView mTV;
private XXX_ViewModel mViewModel;
@Override
protected void onResume() {
super.onResume();
// 监听 XXX_ViewModel#mData 的变化
mViewModel.getData().valueChanged()
.compose(bindUntilEvent(ActivityEvent.PAUSE)) // <-- 管理生命周期
.observeOn(RxSchedulers.mainThread()) // 主线程更新界面
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) {
// 更新文本框
mTV.setText("当前数值是 : " + String.vauleOf(aLong));
}
});
}
@Override
protected void onPause() {
super.onPause();
}
}总结
bye