最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android Jetpack 狠活Lifecycles與LiveData使用詳解

 更新時間:2022年10月20日 10:43:18   作者:ObliviateOnline  
這篇文章主要為大家介紹了Android Jetpack 狠活Lifecycles與LiveData使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

今天在工作時,測試突然提了一個Bug給我,要求我將APP中某活動頁面的UI界面要根據(jù)用戶在由此頁面跳轉的下個頁面操作,在返回時要實時更新。

在檢查代碼時,發(fā)現(xiàn)我已經對界面可變數(shù)據(jù)用LiveData去觀測,但由于頁面變化后并沒有重新初始化UI,所以我放在初始化UI的請求根本沒有起效,如上圖所示例子,在進入下一個頁面如若關閉開關,返回時無法及時更新,于是我便想到了安卓科技與狠活Lifecycles,去監(jiān)聽onResume,在resume時用livedata去post數(shù)據(jù)。

正篇

說了這么多但我們并沒有看到代碼,也即是LiveData是如何用的,所以下面我們先從代碼示例看起:

class MainViewModel(countReserved: Int) : ViewModel() {
    val counter : LiveData<Int>
        get() = _counter
    private var _counter = MutableLiveData<Int>()
    init {
        _counter.value = countReserved
    }
    fun plusOne() {
        var count = _counter.value ?: 0
        _counter.value = count + 1
    }
    fun clear() {
        _counter.value = 0
    }
}

上面代碼用到了我們之前說的ViewModel,與之前不同的是,我們?yōu)樗某蓡T變量添加了LiveData,而且通過_counter設置私有變量的形式對外部不可見,使LiveData就不可變了,這樣就能在非ViewModel中只能觀察LiveData數(shù)據(jù)變化,而不能給LiveData設置數(shù)據(jù)。

為什么要這樣做呢?這就不得不提一下上節(jié)我們的ViewModel生命周期問題,它是長與Activity的,這就可能導致Activity的實例傳給ViewModel,而Activity無法釋放造成內存泄漏,我們是絕對不能那樣寫的。

而LiveData可以包含任何類型數(shù)據(jù),還能在數(shù)據(jù)變化時候通知給觀察者,這樣就能在數(shù)據(jù)變化時主動去通知Activity。

接下來我們再來看看上篇文章中寫成的計數(shù)器的Activity是如何變化的:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    ...
    ...
    var infoText : TextView = findViewById(R.id.infoText)
    plusOneBtn.setOnClickListener {
        viewModel.plusOne()
    }
    clearBtn.setOnClickListener {
        viewModel.clear()
    }
    viewModel.counter.observe(this, Observer { count ->
        infoText.text = count.toString()
    })
}
override fun onPause() {
    super.onPause()
    sp.edit {
        putInt("count_reserved",viewModel.counter.value ?: 0)
    }
}

我們通過對LiveData的counter實例observe觀察從而改變了計數(shù)器,效果如下:

我們可以看到,該計數(shù)器效果沒有變化,但是實際上我們已經將ui數(shù)據(jù)的改變通過ViewModel去實現(xiàn),這樣的代碼更科學也更合理,而且不用擔心ViewModel內部會不會開啟線程執(zhí)行耗時邏輯。

但切記:如果在子線程給LiveData設置數(shù)據(jù),一定得調用postValue()方法,而不能使用setValue()方法,否則會導致異常崩潰。

結語

LiveData應付正常的情況足夠了,但工作還是出現(xiàn)了Bug,畢竟需要我們手動去獲取value,所以本篇LiveData知識部分準備完成,下一篇我們將帶大家去看看Leftcycles是如何亡羊補牢,力挽狂瀾。

以上就是Android Jetpack 狠活Lifecycles與LiveData使用詳解的詳細內容,更多關于Jetpack Lifecycles LiveData的資料請關注腳本之家其它相關文章!

相關文章

最新評論

弥勒县| 建昌县| 青冈县| 永胜县| 若羌县| 宁陵县| 尉犁县| 任丘市| 将乐县| 临夏市| 高邑县| 永清县| 婺源县| 沙田区| 科技| 成安县| 漯河市| 贞丰县| 株洲县| 岗巴县| 油尖旺区| 尚义县| 西充县| 禹州市| 丰镇市| 页游| 和顺县| 礼泉县| 新源县| 菏泽市| 颍上县| 城市| 宾阳县| 乐东| 大悟县| 调兵山市| 武威市| 马鞍山市| 澳门| 濮阳市| 秀山|