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

2 回复

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中的实现非常相似,但需要注意以下几点关键区别:

  1. 线程安全性方面,HarmonyOS Next的LiveData同样保证在主线程更新UI,但底层实现机制不同。postValue()方法在HarmonyOS中会通过ArkTS的TaskDispatcher来确保线程切换。

  2. 数据封装模式(使用_counter私有变量)在HarmonyOS中同样适用,这是推荐的做法。不过HarmonyOS的ViewModel生命周期管理与Android略有不同,需要特别注意。

  3. 观察者模式实现上,HarmonyOS Next使用ArkUI的组件生命周期作为LifecycleOwner,而不是Activity/Fragment。例如在Ability或自定义组件中使用:

viewModel.counter.observe(this.context, (count) => {
    // 更新UI
})
  1. 对于共享首选项(SharedPreferences)的替代,HarmonyOS使用Preferences数据库,需要调整存储部分的代码实现。

整体架构思路保持一致,但具体API实现需要参考HarmonyOS的开发文档进行调整。LiveData的核心优势(生命周期感知、数据驱动UI)在HarmonyOS中同样适用。

回到顶部