// 获取页面状态
lifecycle.currentState
// lifecycle 类里有提供状态的枚举
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
}
复制代码LiveData 提供变换,但是变换只能变换一个,并且变换得到的 LiveData 不能发射数据,必要使用原始的 LiveData 才行,并且变换 API 不是在 LiveData 身上的,而是一个辅助类,这就用着很不爽了,我们都用了 Rxjava 这么久了,不是链式的 API 我们都已经不熟悉了
// Transformations.map()
LiveData<User> userLiveData = ...;
LiveData<String> userName = Transformations.map(userLiveData, user -> {
user.name + " " + user.lastName
});
// Transformations.switchMap()
LiveData<String> userId = ...;
LiveData<User> user = Transformations.switchMap(userId, id -> getUser(id) );
复制代码这里针对变换的问题,我觉得既然 Rxjava 已经实现的很好了,何必在多一手呢,再说再怎么写也肯定不如 rx 不是,所以提供一个方法直接把 subject 抛出来,缺点是就没有自动解绑的功能了,优点是不影响我们发送数据,我们还是用的 subject 发射数据,我测试过了没问题的
自定义 LiveData 代码
为了结构规整,我设计了3层 API,根接口,abs 抽象基类,具体实现,为啥这么麻烦呢,一是为了练手培养代码规范,二是这样设计方便扩展不是
根接口 - 就是设置,获取,发射数据,使用泛型接受数据类型
/**
* 作者 : BloodCrown
* 时间 : 2019-05-05 16:03
* 描述 : 自定义 LiveData 跟接口
*
* 1. 提供获取设置数据的接口
* 2. 发送数据的接口
*/
interface IMyLiveData<T> {
/**
* 获取数据
*/
fun getValue(): T?
/**
* 设置数据
*/
fun setValue(t: T)
/**
* 发送
*/
fun sendValue(t: T)
}
复制代码
abs 抽象基类 - 填充数据对象
/**
* 作者 : BloodCrown
* 时间 : 2019-05-05 16:09
* 描述 : 自定义 LiveData 的抽象基类
*
* 1. 实现根接口,提供数据存储,获取功能
* 2. 发送数据应该是具体实现关心的
*
*/
abstract class AbsMyLiveData<T> : IMyLiveData<T> {
// 数据对象
private var mValue: T? = null
override fun getValue(): T? {
return mValue
}
override fun setValue(t: T) {
this.mValue = t
}
}