日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

LiveData用法介紹

LiveData是Android Jetpack里的一個組件庫,它具有感知activity和fragment生命周期的功能,使用觀察者模式設(shè)置數(shù)據(jù)并確保數(shù)據(jù)在activity和fragment正確的生命周期內(nèi)更新ui,提升App性能,并防止app crash

先來看一個非常簡單的例子

class LiveDataActivity : AppCompatActivity() {
 var liveData: MutableLiveData<String>? = null
 var disposable: Disposable? = null
 override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 setContentView(R.layout.activity_livedata)
 liveData = MutableLiveData()
 // 觀察數(shù)據(jù)的變化,只有在界面可見的時候才會回調(diào)(即onStart或onResume狀態(tài))
 liveData!!.observe(this, Observer {
 tv_text.text = it
 })
 loadData()
 }
 override fun onDestroy() {
 super.onDestroy()
 disposable?.dispose()
 }
 private fun loadData() {
 disposable = Flowable.interval(1, 1, TimeUnit.SECONDS)
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe {
 // 更新數(shù)據(jù)
 liveData?.value = it.toString()
 }
 }
}

LiveData的用法非常簡單,首選new一個LiveData對象,然后通過observe方法添加一個Observer,并實現(xiàn)Observer接口的onChanged方法,最后在數(shù)據(jù)更新的時候使用livedata的setValue方法更新數(shù)據(jù)即可;調(diào)用setValue方法的時候,如果當(dāng)前Activity處于onStart或onResume狀態(tài),則會調(diào)用Observer的onChanged回調(diào),否則先緩存數(shù)據(jù),當(dāng)Activity重新回到onStart或onResume狀態(tài)時,再調(diào)用Observer的onChanged回調(diào)(Activity destroy時 會自動remove Observer,所以不需要我們手動remove)

LiveData 幾個比較重要的方法介紹

setValue(T value)

  • 必須在 UI Thread 中調(diào)用,更新數(shù)據(jù),同時當(dāng)Activity處于onStart或onResume狀態(tài)時會調(diào)用Observer的onChanged回調(diào)

postValue(T value)

  • 跟setValue()一樣,唯一的區(qū)別就是可以 非UI Thread 中調(diào)用,然后通過handler post在UI Thread中回調(diào)

observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer)

  • 這是一個非常常用的方法, 用于添加一個Observer,監(jiān)聽數(shù)據(jù)的變化; LifecycleOwner 一般是activity 或 fragment對象,使其LiveData可以感知其生命周期,只有在onStart或onResume狀態(tài)時會調(diào)用Observer的onChanged回調(diào), 在destroy時 remove Observer

observeForever(@NonNull Observer<? super T> observer)

  • 跟observe方法差不多,唯一的區(qū)別是沒辦法感知activity 或 fragment生命周期;即只要有數(shù)據(jù)更新就立馬調(diào)用Observer的onChanged回調(diào),并且需要手動remove Observer;這個方法對于Transformation(數(shù)據(jù)轉(zhuǎn)換)非常有用,下面會介紹到

removeObservers(@NonNull final Observer<? super T> observer)

  • 這個方法很簡單,就是刪除某個observer

onActive()

  • 這是LiveData的一個回調(diào)方法,當(dāng)observer的數(shù)量由0變成1的時候,會調(diào)用

onInactive()

  • 這是LiveData的一個回調(diào)方法,當(dāng)observer的數(shù)量由1變成0的時候,會調(diào)用

MutableLiveData 介紹

MutableLiveData 比較簡單,一般沒什么特殊需求,用MutableLiveData就可以,他的源碼實現(xiàn)也非常簡單

public class MutableLiveData<T> extends LiveData<T> {
 @Override
 public void postValue(T value) {
 super.postValue(value);
 }
 @Override
 public void setValue(T value) {
 super.setValue(value);
 }
}

只是將LiveData用protected修飾postValue和setValue的方法改成了public

用法就跟上面的demo一樣

MediatorLiveData 介紹

MediatorLiveData繼承MutableLiveData, 并提供addSource(@NonNull LiveData<S> source, @NonNull Observer<? super S> onChanged)方法監(jiān)聽LiveData的數(shù)據(jù)更新,然后做一層處理或直接通知給最外層的Observer

先看一下源碼里的example, 只處理前10次數(shù)據(jù)的變化

LiveData<String> liveData1 = ...;
var liveDataMerger = MediatorLiveData<String>()
liveDataMerger.addSource(liveData1, object: Observer<String> {
 var count = 1
 override fun onChanged(t: String) {
 count++
 // 在這里更新liveDataMerger的數(shù)據(jù);因此可以在這里對數(shù)據(jù)做一些額外的處理之后再更新
 liveDataMerger.value = t
 if (count > 10) {
 liveDataMerger.removeSource(liveData1)
 }
 }
})

同時它還可以監(jiān)聽多個LiveData的變化

val liveData1 = MutableLiveData<String>()
val liveData2 = MutableLiveData<String>()
var liveDataMerger = MediatorLiveData<String>()
liveDataMerger.addSource(liveData1, Observer { liveDataMerger.value = it })
liveDataMerger.addSource(liveData2, Observer { liveDataMerger.value = it })
// 只要liveData1和liveData2數(shù)據(jù)有更新就會通知Observer更新ui
liveDataMerger.observe(this, Observer {
 tv_text.text = it
})

其實MediatorLiveData最常用的用法是結(jié)合Transformation來使用,下面將介紹Transformation的用法

Transformation 轉(zhuǎn)換

Transformation內(nèi)部原理使用MediatorLiveData實現(xiàn)的

有的時候我們需要對當(dāng)前data 轉(zhuǎn)換成我們需要的另一種data

比如rxJAVA的map方法

Flowable.range(1, 10)
	.map { "index: $it" }
	.subscribe {
		
	}

再比如 kotlin自帶的map擴展方法

val list = listOf(1, 2, 3, 4).map {
 "index: $it"
}

LiveData 也提供了類似的map功能

// 創(chuàng)建LiveData
val userLiveData: LiveData<User> = MutableLiveData<User>()
val userName: LiveData<String> = Transformations.map(userLiveData) {
 user -> "${user.name} ${user.lastName}"
}
//觀察數(shù)據(jù)的更新
userName.observe(this, Observer {
 tv_text.text = it
})
...
// 更新數(shù)據(jù)
userLiveData.value = User("zhang", "san")

LiveData 也提供了switchMap方法轉(zhuǎn)換數(shù)據(jù),它與map唯一的不同是將data轉(zhuǎn)換成一個LiveData<T>,因此在轉(zhuǎn)換過程中可以繼續(xù)做異步操作請求數(shù)據(jù)等,他跟rxjava的flatmap方法有點像

// 先使用room數(shù)據(jù)庫定義一個UserDao example
@Dao
abstract class UserDao {
 @Query("select * from tab_user where uid = :uid")
 abstract fun getById(uid: Long): LiveData<User>
}	
...
private fun getUser(id: String): LiveData<User> {
	// 可以使用room數(shù)據(jù)查詢user對象
 // return AppDataBase.getUserDao().getUser(id)
 // 你也可以發(fā)網(wǎng)絡(luò)請求查詢user對象
 return object: LiveData<User>() {
 override fun onActive() {
 super.onActive()
 // 模擬網(wǎng)絡(luò)請求數(shù)據(jù)
 Flowable.timer(3, TimeUnit.SECONDS)
 .subscribe {
 postValue(User("zhang", "san"))
 }
 }
 }
}
...
val userId: LiveData<String> = MutableLiveData<String>()
val user = Transformations.switchMap(userId) { id -> getUser(id) }
//觀察數(shù)據(jù)的更新
user.observe(this, Observer {
 tv_text.text = "${it.name} ${it.name}"
})
...
// 更新數(shù)據(jù)
userId.value = "001"

LiveData使用起來比較簡單,功能就介紹到這里,建議查看一下官方demo 學(xué)習(xí)結(jié)合其它library的用法

分享到:
標(biāo)簽:android
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定