日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Android LiveData使用

發布時間:2023/12/19 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 Android LiveData使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LiveData是一個可觀察的數據持有者類。 與常規observable不同,LiveData是生命周期感知的,當生命周期處于STARTED或RESUMED狀態,則LiveData會將其視為活動狀態,這意味著它尊重其他應用程序組件的生命周期,例如Activity,Fragment或Service。
LiveData具有以下優點:

UI和數據保持一致:遵循觀察者模式,生命周期狀態更改時,LiveData會通知Observer對象
避免內存泄漏:觀察者綁定到Lifecycle對象,并在其相關生命周期被破壞后自行清理
不會因stop而崩潰:處于非活動狀態,不會接收到LiveData事件,如Activity變為不可見
自動感知生命周期:LiveData自動管理在觀察時意識到相關的生命周期狀態變化。
數據始終保持最新:生命周期變為非活動狀態再次變為活動狀態時接收最新數據。 例如,Activity不可見變為可見時立即接收最新數據
解決Configuration changes問題:當屏幕旋轉或者回收時,重新創建Activity或Fragment,可以即時收到數據變更
共享資源:使用單例擴展LiveData,就可在app中共享它
gradle配置

def lifecycle_version = "2.0.0"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" 

創建LiveData對象

class TestViewModel : ViewModel() {
    private lateinit var userName: MutableLiveData<String>

    fun getUserName(): MutableLiveData<String> {
        if (!::userName.isInitialized) {
            userName = MutableLiveData()
            loadUsers()
        }
        return userName
    }

    private fun loadUsers() {
        userName.value = "test"
    }
}

觀察和變更LiveData對象

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var model = ViewModelProviders.of(this).get(TestViewModel::class.java)
        model.getUserName().observe(this, Observer {
            txt_test.text = it
        })// 觀察
        btn_test.setOnClickListener {
            model.getUserName().value = "test 2"
        }// 變更
    }
}

在變更數據的使用有兩種方式可用,一個是setValue,另外一個是postValue,區別是setValue只能在主線程處理,postValue可以在子線程處理。

LiveData結合Databinding使用

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        var binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        var model = ViewModelProviders.of(this).get(TestViewModel::class.java)
        binding.let {
            it.data = model
            it.setLifecycleOwner(this)
        }
        btn_test.setOnClickListener {
            model.getUserName().value = "test 2"
        }
    }
}

binding對象需要調用setLifecycleOwner(LifecycleOwner lifecycleOwner)設置lifecycleOwner對象。

擴展LiveData

通常LiveData只關心觀察者的STARTED或RESUMED狀態,下面代碼片段擴展了LiveData

class StockLiveData(symbol: String) : LiveData<BigDecimal>() {
    private var mStockManager: StockManager? = null

    private val mListener = object : SimplePriceListener() {
        fun onPriceChanged(price: BigDecimal) {
            value = price
        }
    }

    init {
        mStockManager = StockManager(symbol)
    }

    override fun onActive() {
        mStockManager.requestPriceUpdates(mListener)
    }

    override fun onInactive() {
        mStockManager.removeUpdates(mListener)
    }
}

實現包括以下重要方法:

當?LiveData?對象具有活躍觀察者時,會調用?onActive()?方法。這意味著,您需要從此方法開始觀察數據更新。
當?LiveData?對象沒有任何活躍觀察者時,會調用?onInactive()?方法。由于沒有觀察者在監聽,因此沒有理由與?StockManager?服務保持連接。
setValue(T)?方法將更新?LiveData?實例的值,并將更改通知給任何活躍觀察者。
使用擴展LiveData

class TestFragment : Fragment() {

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        val stockLiveData = StockLiveData("")
        stockLiveData.observe(this, Observer {
            // update UI
        })
    }
}

observe()?方法將傳遞 Fragment(它是?LifecycleOwner?的實例)作為第一個參數。這樣做表示此觀察者綁定到與所有者關聯的?Lifecycle?對象,這意味著:

如果?Lifecycle?對象未處于活躍狀態,那么即使值發生更改,也不會調用觀察者。
銷毀?Lifecycle?對象后,會自動移除觀察者

當然可以在多個 Activity、Fragment 和 Service 之間共享它們,只需要把 StockLiveData類實現為單例。

轉換 LiveData

LiveData?對象分派給觀察者之前對存儲在其中的值進行更改,或者您可能需要根據另一個實例的值返回不同的?LiveData?實例。其提供了以下方法進行轉換

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) );

要實現您自己的轉換,可以使用?MediatorLiveData?類,該類可以監聽其他?LiveData?對象并處理它們發出的事件,其可以正確地將其狀態傳播到源?LiveData?對象。

總結

以上是生活随笔為你收集整理的Android LiveData使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。