单独使用LiveData
- 创建LiveData实例。持有特定的数据类型,例如 int ,String。
- 创建一个Observer对象,并且实现onChanged()方法。在onChanged()方法类可以进行UI的刷新等。
- 使用LiveData实例的observe(…,…)方法,将Observer对象添加到LiveData中。方法原型为 observe(LifecycleOwner owner,Observer observer),第一个参数是LifecycleOwner对象,为LiveData能够监听生命周期的能力来源。第二个参数为我们的监听对象。
添加LiveData和ViewModel的依赖 ↓
// 添加LiveData和ViewModel的依赖implementation 'android.arch.lifecycle:extensions:1.1.1'
界面准备按钮用来开启,使得UI刷新 ↓
MainActivity中的代码 ↓
class MainActivity : AppCompatActivity() {
val TAG = "MainActivity"
val btnStart = btn_start
val mTvNumber = tv_number
var mNumberLiveData: MutableLiveData<Int>? = null // 声明变量
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mNumberLiveData = MutableLiveData()
btnStart.setOnClickListener { view: View? ->
thread {
var number = 0
while (number < 5) {
mNumberLiveData?.postValue(number)
Log.d(TAG, "setOnClickListener" + number)
Thread.sleep(3000)
number++
}
}
}
mNumberLiveData?.observe(this, object : Observer<Int> {
override fun onChanged(t: Int?) {
mTvNumber.setText("" + t)
Log.d(TAG, "onChanged" + t)
}
})
}
}
界面的TextView会根据数据进行刷新。
单独使用ViewModel
- 创建ViewModel的继承类
- 在控制器中实例化继承类
创建ViewModel继承类 ↓
class MyViewModel() : ViewModel() {
var number = 0
}
修改控制器 ↓
class MainActivity : AppCompatActivity() {
val TAG = "MainActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ViewModelProvider.of() 获得MyViewModel持久类用来保存UI数据
// "MyViewModel::class.java" 反射引用类型
var myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
tv_number.setText(myViewModel.number.toString())
btn_start.setOnClickListener {
myViewModel.number++
tv_number.setText(myViewModel.number.toString())
}
}
}
简单的界面样式 ↓
LiveData和ViewModel配合使用
- 需要有ViewModel的继承类
- 需要在ViewModel的继承类中实例化LiveData类型
- 需要在控制器中初始化ViewModel的继承类
- 需要调用LiveData的observe的方法
class MyViewModel : ViewModel() {
var mutableLiveData = MutableLiveData<Int>()
init {
mutableLiveData.value=0
}
fun getLive(): MutableLiveData<Int> {
return mutableLiveData
}
fun addNumber(number: Int) {
mutableLiveData?.value=number+ mutableLiveData.value!!
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 获得MyViewModel实例
var myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
btn_addone.setOnClickListener {
myViewModel?.addNumber(1)
}
myViewModel?.getLive()?.observe(this, object : Observer<Int> {
override fun onChanged(t: Int?) {
tv_number.setText(t.toString())
}
})
}
}
什么是LiveData
LiveData是一个可以观察的数据持有类,但是不同于通常的观察者,它具有声明周期的感知能力。通俗些讲,它所持有的数据发生改变时,并且Lifecycle对象还处于活跃状态,LiveData将立即通知观察者数据发生了变化。相比于不同的观察者它多了生命周期和感知能力。
什么是ViewModel
简单说ViewModel是一种用来存储和管理UI相关数据的类。但是与其他的Model不同的是,他支持在系统改变时保存数据。
当屏幕发生改变时,会导致Activity/Fragment重新绘制,会导致我们之前的数据丢失。比如,在EditText中输入了内容,但是当屏幕扭转时,会发现editText中的文本被清空了。
当对于一下简单的数据,我们可以通过Activity的onSaveInstanceState()方法中储存,然后通过onCreate()中进行恢复,但是这种方式只适合存储少量的数据,并且是能被序列化和反序列的数据。而对那些大量的数据则不适用。
此外,它也使View的数据持有者和Viewcontroller逻辑更加分离,便于解耦和测试。
引用:https://juejin.im/post/5ca9f9156fb9a05e3d0a8aea#heading-6