Jetpack系列:LiveData入门级使用方法
《家庭疗法基础》- 入门级理解家庭系统疗法 #生活技巧# #健康生活方式# #健康生活方式书籍# #健康家庭疗法#
框架搭建
APP首先需要搭建使用LiveData的环境:
导入依赖包
//app build.gradle
dependencies {
…
implementation deps.lifecycle.viewmodel_ktx
implementation deps.lifecycle.livedata_ktx
…
}
创建ViewModel类(用于LiveData数据的封装,和UI交互)
class LiveDataViewModel(
private val dataSource: DataSource
) : ViewModel() {…}
Activity绑定ViewModel
//MainActivity
//成员变量
private val viewmodel: LiveDataViewModel by viewModels { LiveDataVMFactory }
//onCreate
val binding = DataBindingUtil.setContentView(
this, R.layout.activity_livedata
)
// Set the LifecycleOwner to be able to observe LiveData objects
binding.lifecycleOwner = this
// Bind ViewModel
binding.viewmodel = viewmodel
//LifeDataVMFactory
object LiveDataVMFactory : ViewModelProvider.Factory {
private val dataSource = DefaultDataSource(Dispatchers.IO)
override fun <T : ViewModel?> create(modelClass: Class): T {
@Suppress(“UNCHECKED_CAST”)
return LiveDataViewModel(dataSource) as T
}
}
注意:此处构造ViewModel采用的dataSource为DefaultDataSource,后续数据是根据此数据源来进行获取的。
系统时间(Long型)显示
系统时间的显示,通过在UI上绑定ViewModel,通过getCurrentTime方法后台更新、提交数据,来通知UI进行显示的更新。
//xml
<TextView
android:id="@+id/time"
android:text="@{Long.toString(viewmodel.currentTime)}"
…/>
//LiveDataViewModel
val currentTime = dataSource.getCurrentTime()
//DefaultDataSource
override fun getCurrentTime(): LiveData =
liveData {
while (true) {
emit(System.currentTimeMillis())//通知当前系统时间
delay(1000)//延时1秒
}
}
系统时间显示
系统时间的显示是根据系统获取的Long型变量变化映射得到的,Long值发生变化时,实时更新系统时间显示。
//xml
<TextView
android:id="@+id/time_transformed"
android:text="@{viewmodel.currentTimeTransformed}"
…/>
//LiveDataViewModel 此处有两种方式实现
//1. currentTime变更后实时通知UI更新
val currentTimeTransformed : LiveData = Transformations.map(currentTime) {
Date(it).toString()
}
//2. 延时500ms后通知
val currentTimeTransformed = currentTime.switchMap {
// timeStampToTime is a suspend function so we need to call it from a coroutine.
liveData { emit(timeStampToTime(it)) }
}
private suspend fun timeStampToTime(timestamp: Long): String {
delay(500) // Simulate long operation
val date = Date(timestamp)
return date.toString()
}
天气显示
天气的显示通过动态改变数据源提供的数据,从而通知UI显示(DataSource数据的更新实时通过LiveData传递到UI)。
//xml
<TextView
android:id="@+id/current_weather"
android:text="@{viewmodel.currentWeather}"
…/>
//LiveDataViewModel
val currentWeather: LiveData = liveData {
emit(LOADING_STRING)
emitSource(dataSource.fetchWeather())
}
//DefaultDataSource
private val weatherConditions = listOf(“Sunny”, “Cloudy”, “Rainy”, “Stormy”, “Snowy”)
override fun fetchWeather(): LiveData = liveData {
var counter = 0
while (true) {
counter++
delay(2000)//延时两秒
//按顺序循环显示weatherConditions中的天气数据信息
emit(weatherConditions[counter % weatherConditions.size])
}
}
远端数据显示
远端数据的请求通过Button的点击事件触发,数据获取成功后,通知TextView进行数据显示。
//xml
<TextView
android:id="@+id/cached_value"
android:text="@{viewmodel.cachedValue}"
…/>
<Button
android:id="@+id/refresh_button"
android:onClick="@{() -> viewmodel.onRefresh()}"
…/>
//LiveDataViewModel
val cachedValue = dataSource.cachedData
fun onRefresh() {
// Launch a coroutine that reads from a remote data source and updates cache
viewModelScope.launch {
dataSource.fetchNewData()
}
}
//DefaultDataSource
private val _cachedData = MutableLiveData(“This is old data”)
override val cachedData: LiveData = _cachedData
override suspend fun fetchNewData() {
// Force Main thread
withContext(Dispatchers.Main) {
_cachedData.value = “Fetching new data…”
_cachedData.value = simulateNetworkDataFetch()
}
}
private var counter = 0
// Using ioDispatcher because the function simulates a long and expensive operation.
private suspend fun simulateNetworkDataFetch(): String = withContext(ioDispatcher) {
delay(3000)//延时3秒
counter++
“New data from request #$counter”//返回此字符串
}
深圳网站建设www.sz886.com
网址:Jetpack系列:LiveData入门级使用方法 https://www.yuejiaxmz.com/news/view/369717
相关内容
探索未来移动应用:ManPinAPP探索高效日程管理:AndroidCalendar 项目深度解析
LG vs6系列“敲一敲”大容量对开门冰箱:用鲜活科技升级多面美好生活
Flash MX 2004视频教程超速入门系列(1)
Flash MX 2004视频教程超速入门系列(2)
移动应用开发的未来:跨平台框架与原生系统的融合
JBL STUDIO6专业家庭影院系列评测 使用体验怎么样
家庭影院设备的入门级选择与搭配
安全、便捷一网打尽 华为智能门锁系列开启智慧生活大门
东方美学融入现代生活:逗万太一系列的创新之旅