HarmonyOS 鸿蒙Next LiveData
HarmonyOS 鸿蒙Next LiveData
LiveData
?: 表达式不为空就返回左边,为空返回右边
前面是手动去更新界面,如果在ViewModel中有子线程耗时逻辑,那么点击后更新的数据可能不变
绝大多数情况下,LiveData和ViewModel结合使用,可以包装任何类型的数据,然后在Activity中去观察这个数据,如果发生变化,就可以主动把数据变化通知给Activity
class MainViewModel(countReserved:Int) : ViewModel() {
var counter=MutableLiveData<Int>()//把counter修改为MutabelLiveData对象,这是一种可变的LiveData,他有三种用法:getValue(),setValue()(只能在主线程中调用),postValue()(在非主线程中调用给LiveData设置数据)
init{
counter.value=countReserved
}
fun plusOne(){
val count=counter.value?:0
counter.value=count+1
}
fun clear(){
counter.value=0
}
}
class MainActivity : AppCompatActivity() {
lateinit var viewModel:MainViewModel
lateinit var binding:ActivityMainBinding
lateinit var sp:SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding=ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
sp=getPreferences(Context.MODE_PRIVATE)
val countReserved=sp.getInt("count_reserved",0)
viewModel=ViewModelProvider(this,MainViewModelFactory(countReserved))
.get(MainViewModel::class.java)
binding.plusOneBtn.setOnClickListener{
viewModel.plusOne()
}
binding.clearBtn.setOnClickListener {
viewModel.clear()
}
//observe观察数据变化,第一个参数是LifecycleOwner,继承了AppCompatActivity的Activity,或者是继承自androidx .fragment.app.Fragment的Fragment都是LifecycleOwner,可以直接传this,第二个参数是Observer接口,counter数据发生变化就会回调到这里,在这进行界面更新
viewModel.counter.observe(this, Observer{
count->binding.infoText.text=count.toString()
})
}
override fun onPause() {
super.onPause()
sp.edit {
putInt("count_reserved",viewModel.counter.value?:0)
}
}
但是这样会把counter这个可变的LiveData暴露给外部,可能被设置修改数据,
class MainViewModel(countReserved:Int) : ViewModel() {
val counter: LiveData<Int>//把counter声明为不可变的LiveData
get()=_counter//给get设置返回_counter, 这样只能调用counter获得_counter,但是不能给counter设置数据
//每次外部代码尝试读取 counter 属性的值时,get() 方法会被调用,并返回 _counter 的值。
private val _counter=MutableLiveData<Int>()//private,并且改名为 _counter
init{
_counter.value=countReserved
}
fun plusOne(){
val count=_counter.value?:0
_counter.value=count+1
}
fun clear(){
_counter.value=0
}
}
更多关于HarmonyOS 鸿蒙Next LiveData的实战教程也可以访问 https://www.itying.com/category-93-b0.html
HarmonyOS的LiveData是鸿蒙应用开发中的数据观察组件,基于ArkTS实现。它遵循观察者模式,允许UI组件监听数据变化并自动更新。LiveData具有生命周期感知能力,仅在组件处于活跃状态时通知更新,避免了内存泄漏问题。在鸿蒙Next中,LiveData通常与@State、@Link等装饰器配合使用,支持跨页面数据共享。其核心方法包括setValue()同步更新和postValue()异步更新。LiveData还支持数据转换和合并操作,通过map()和switchMap()实现。
更多关于HarmonyOS 鸿蒙Next LiveData的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,LiveData的使用与Android中的实现非常相似,但需要注意以下几点关键区别:
-
线程安全性方面,HarmonyOS Next的LiveData同样保证在主线程更新UI,但底层实现机制不同。postValue()方法在HarmonyOS中会通过ArkTS的TaskDispatcher来确保线程切换。
-
数据封装模式(使用_counter私有变量)在HarmonyOS中同样适用,这是推荐的做法。不过HarmonyOS的ViewModel生命周期管理与Android略有不同,需要特别注意。
-
观察者模式实现上,HarmonyOS Next使用ArkUI的组件生命周期作为LifecycleOwner,而不是Activity/Fragment。例如在Ability或自定义组件中使用:
viewModel.counter.observe(this.context, (count) => {
// 更新UI
})
- 对于共享首选项(SharedPreferences)的替代,HarmonyOS使用Preferences数据库,需要调整存储部分的代码实现。
整体架构思路保持一致,但具体API实现需要参考HarmonyOS的开发文档进行调整。LiveData的核心优势(生命周期感知、数据驱动UI)在HarmonyOS中同样适用。