基于RxJava的LiveData實(shí)現(xiàn)
架構(gòu)組件
谷歌官方推出了架構(gòu)組件猴娩,用來解決生命周期阴幌,數(shù)據(jù)庫(kù)訪問,ViewModel的定義卷中,數(shù)據(jù)訂閱等等問題矛双。
LiveData
通過相關(guān)閱讀1這篇文章,是可以知道LiveData是擁有對(duì)LifeCycle感知能力的蟆豫,可以在onStart環(huán)節(jié)通知觀察者數(shù)據(jù)议忽,并且在onDestory階段移除觀察者。
但這都是新的一套十减,如果項(xiàng)目中已經(jīng)大量使用RxJava的同學(xué)來說栈幸,LiveData又不能完全融入到RxJava體系中去,需要有一些轉(zhuǎn)換操作帮辟。有LiveDataReactiveStreams速址、LiveDataToRxJava等的轉(zhuǎn)換工具,也有類似Live這樣可以給RxJava注入生命周期感知的代碼由驹。
RxData
我自己做了RxData芍锚,用200行代碼基于RxJava實(shí)現(xiàn)LiveData的基本功能,使用方式和LiveData也比較像,優(yōu)勢(shì)就是RxJava和LiveData的優(yōu)勢(shì)合體并炮,可以輕松做到線程切換蒿赢,同時(shí)也可以RxData處理生命周期
1. 定義一個(gè)數(shù)據(jù)
類似Observable
和LiveData
var dataRx = RxData<String>()
2. 設(shè)置或者獲取數(shù)據(jù)
// 設(shè)置數(shù)據(jù),支持Null
dataRx.set("Hello RxData")
// 獲取數(shù)據(jù)
var str = dataRx.get()
3. 設(shè)置Rx訂閱
? 為了方便看清楚返回類型渣触,沒用lambda語法。onNext
方法將會(huì)返回一個(gè)DataWrap
的數(shù)據(jù)包裝類壹若,可以判斷數(shù)據(jù)是否為空
dataRx.observable(lifecycleowner)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Consumer<RxData.DataWrap<String>> {
override fun accept(t: RxData.DataWrap<String>?) {
if (t!!.isNull) {
System.out.println("獲取了一個(gè)Null值")
} else {
val str = t.get()
}
}
})
結(jié)束語
? 是不是很簡(jiǎn)單嗅钻,代碼不多,使用起來也很方便店展⊙ǎ可以任意切換線程,并且擁有生命周期感知的能力
? 有問題歡迎大家來踩赂蕴。
? Github地址:https://github.com/wanpg/RxData