自定义 LiveData 简单思路

 // 获取页面状态
    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
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值