📜  Android体系结构组件中的LiveData

📅  最后修改于: 2021-05-09 17:22:08             🧑  作者: Mango

LiveData是android体系结构组件之一。 LiveData是可观察的数据持有者类。可观察的含义在这里,可观察的意思是实时数据可以通过活动和片段(UI控制器)等其他组件进行观察。 LiveData最重要的事情是,它具有有关其观察者生命周期(例如活动或片段)的知识。这意味着实时数据只会更新处于活动生命周期状态的应用程序组件,例如“活动”或“片段”。 LiveData通知处于生命周期已开始或已恢复状态的观察者(活动或片段)。未注册注册以观看LiveData对象的非活动观察者不会收到有关更改的通知。此处非活动观察者的含义是未处于“已启动”或“已恢复”状态。可以注册一个与实现LifecycleOwner接口的对象配对的观察者,我们将在我们的示例中看到该接口。当对应的Lifecycle对象的状态更改为DESTROYED时,此关系允许除去观察者。

该组件是可观察的数据持有者类别,即可以观察到所包含的值。 LiveData是生命周期感知的组件,因此它根据其他应用程序组件的生命周期状态执行其功能。此外,如果观察者的生命周期状态为活动状态,即STARTED或RESUMED,则只有LiveData才能更新应用程序组件。 LiveData始终在进行任何更新之前检查观察者的状态,以确保观察者必须处于活动状态才能接收它。如果观察者的生命周期状态被破坏,LiveData可以将其删除,从而避免内存泄漏。它使数据同步的任务更加容易。

实时数据

必须通过LiveData实现onActiveonInactive方法:

为了观察LiveData组件的观察者(LifecycleOwner,Observer )方法被调用:

在Android App中实施

在此示例中,我们将创建一个简单的计数器应用程序,仅需5秒,您可以使用LiveData进行任何操作,但现在让我们构建一个小型应用程序。

步骤1:在build.gradle文件中添加这些依赖项

步骤2:使用activity_main.xml文件

导航到应用程序> res>布局> activity_main.xml,然后将以下代码添加到该文件中。以下是activity_main.xml文件的代码。

XML


  
    
  


Kotlin
import androidx.lifecycle.ViewModel
  
class MainActivityViewModel:ViewModel() {
  
    private val _seconds = MutableLiveData()
    private val _finished = MutableLiveData()
  
    // getter method for seconds var
    fun seconds():LiveData{
        return _seconds
    }
      
    // getter method for finished var
    fun finished():LiveData{
        return _finished
    }
  
  
    // Counter method that uses CountDownTimer()
    fun startCounter(){
      
        // you can change the millisInFuture value 
        object : CountDownTimer(5000, 100) {
            override fun onTick(millisUntilFinished: Long) {
                val time = millisUntilFinished / 1000
                  
                // setting the count value
                _seconds.value = time.toInt()
            }
  
            override fun onFinish() {
                 // if millisInFuture completed
                 // it set the value true
                _finished.value = true
            }
        }.start()
    }
}


Kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
          
        // creating instance of our ViewModel class
        val viewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)
  
        // calling start counter methos which is in our viewmodel class
        viewModel.startCounter()
  
          
        // observing the second value of our view model class
        viewModel.seconds().observe(this, Observer {
             
            // setting textview value
            textView.text = it.toString()
        })
  
        viewModel.finished().observe(this, Observer {
            if(it){
                // if count time finished it set the value
                textView.text = "Finished"
            }
        })
    }
}


步骤3:创建Kotlin类文件MainActivityViewModel.kt。我们的MainActivity类文件扩展了ViewModel类。

科特林

import androidx.lifecycle.ViewModel
  
class MainActivityViewModel:ViewModel() {
  
    private val _seconds = MutableLiveData()
    private val _finished = MutableLiveData()
  
    // getter method for seconds var
    fun seconds():LiveData{
        return _seconds
    }
      
    // getter method for finished var
    fun finished():LiveData{
        return _finished
    }
  
  
    // Counter method that uses CountDownTimer()
    fun startCounter(){
      
        // you can change the millisInFuture value 
        object : CountDownTimer(5000, 100) {
            override fun onTick(millisUntilFinished: Long) {
                val time = millisUntilFinished / 1000
                  
                // setting the count value
                _seconds.value = time.toInt()
            }
  
            override fun onFinish() {
                 // if millisInFuture completed
                 // it set the value true
                _finished.value = true
            }
        }.start()
    }
}

步骤4:使用MainActivity.kt文件

转到MainActivity.kt文件,并参考以下代码。下面是MainActivity.kt文件的代码。

科特林

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
          
        // creating instance of our ViewModel class
        val viewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)
  
        // calling start counter methos which is in our viewmodel class
        viewModel.startCounter()
  
          
        // observing the second value of our view model class
        viewModel.seconds().observe(this, Observer {
             
            // setting textview value
            textView.text = it.toString()
        })
  
        viewModel.finished().observe(this, Observer {
            if(it){
                // if count time finished it set the value
                textView.text = "Finished"
            }
        })
    }
}

输出:

使用LiveData的优势

  • 无需每次都更新UI: LiveData遵循观察者模式。当发生任何更改时,LiveData会通知Observer对象。
  • 无内存泄漏:观察者绑定到Lifecycle对象,并在销毁其关联的生命周期后自行清理。
  • 不再需要手动进行生命周期处理: UI组件仅观察相关数据,而不会停止或继续观察。由于LiveData在观察的同时知道相关生命周期状态的变化,因此它会自动管理所有这一切。
  • 正确的配置更改:如果由于配置更改(例如设备旋转)而重新创建活动或片段,则该活动或片段会立即接收最新的可用数据。
想要一个节奏更快,更具竞争性的环境来学习Android的基础知识吗?
单击此处前往由我们的专家精心策划的指南,以使您立即做好行业准备!