LiveData是一个可观察的数据持有类,自动处理生命周期,防止内存泄漏,同步数据更新。
MutableLiveData:观察对象变化
Transformations.map和Transformations.switchMap:间接观察对象,map观察普通对象,switchMap观察LiveData的子类
例子
class MainActivity : AppCompatActivity() {
//创建LiveData
private val operation = MutableLiveData<Operation>()
//创建num的LiveData
private val num = Transformations.map(operation) {
//operation对象改变,修改num.setValue(operation.num)
it.num
}
//创建result的LiveData
private val result = Transformations.switchMap(operation) {
//operation对象改变,添加operation.result.observe{result.setValue(it)}
it.result
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
operation.observe(this, Observer {
//operation对象发生变化时调用
textView1.text = it?.num?.toString()
})
num.observe(this, Observer {
//num对象发生变化时调用
textView2.text = it?.toString()
})
result.observe(this, Observer {
//result对象发生变化时调用
textView3.text = it?.toString()
})
button1.setOnClickListener {
//修改operation,主线程使用setValue,子线程使用postValue
operation.setValue(Operation((operation.value?.num ?: 0) + 1))
}
button2.setOnClickListener {
//计算
operation.value?.mul()
}
}
}
class Operation(val num: Int) {
val result = MutableLiveData<Int>()
fun mul() {
//乘法计算
result.value = (num * num)
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改num" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="计算结果" />
</LinearLayout>
逻辑图
给LiveData添加观察者,使用setValue()方法修改数据,Observer会接受到回调
使用Transformations的map和switchMap方法,实现间接观察对象