Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

27.8. MutableLiveData

定义 MutableLiveData

		
    companion object {
        val mutableLiveData = MutableLiveData<String>()
    }		
		
		

监听 MutableLiveData

		
        mutableLiveData.observe(this) { text ->
            CoroutineScope(Dispatchers.Main).launch {
                binding.textViewSentence.text = text
            }
        }
		
		

发送数据

		
	TestActivity.mutableLiveData.postValue(sentence.result)
		
		

27.8.1. MutableLiveData 使用 Pair 传 key, value 两个值

			
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

class KeyValueLiveDataActivity : AppCompatActivity() {
    // 定义存储 Pair 的 LiveData(Pair<key类型, value类型>)
    private val keyValueLiveData = MutableLiveData<Pair<String, Int>>()

    private lateinit var infoTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_key_value_live_data)
        infoTextView = findViewById(R.id.tv_info)

        // 观察键值对数据
        observeKeyValueData()

        // 模拟发送键值对
        simulateKeyValueUpdates()
    }

    private fun observeKeyValueData() {
        keyValueLiveData.observe(this) { pair ->
            // pair 是 Pair 对象,通过 first 取 key,second 取 value
            val key = pair.first
            val value = pair.second
            infoTextView.text = "收到键值对:\nkey=$key, value=$value"
        }
    }

    private fun simulateKeyValueUpdates() {
        CoroutineScope(Dispatchers.Main).launch {
            // 发送第一个键值对
            delay(1000)
            keyValueLiveData.value = Pair("北京", 25)  // key="北京", value=25

            // 发送第二个键值对
            delay(3000)
            keyValueLiveData.value = Pair("上海", 28)  // key="上海", value=28
        }
    }
}			
			
			

27.8.2. MutableLiveData 传自定义对象

			
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

// 自定义数据类,明确存储 "城市"(key)和 "温度"(value)
data class CityTemp(val city: String, val temp: Int)

class CustomClassLiveDataActivity : AppCompatActivity() {
    // 定义存储自定义数据类的 LiveData
    private val cityTempLiveData = MutableLiveData<CityTemp>()

    private lateinit var infoTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_key_value_live_data)
        infoTextView = findViewById(R.id.tv_info)

        // 观察自定义数据类
        observeCityTemp()

        // 模拟发送数据
        simulateDataUpdates()
    }

    private fun observeCityTemp() {
        cityTempLiveData.observe(this) { cityTemp ->
            // 直接通过属性名访问 key 和 value,语义更清晰
            infoTextView.text = "城市:${cityTemp.city}\n温度:${cityTemp.temp}℃"
        }
    }

    private fun simulateDataUpdates() {
        CoroutineScope(Dispatchers.Main).launch {
            delay(1000)
            cityTempLiveData.value = CityTemp("北京", 25)  // 传递 key 和 value

            delay(3000)
            cityTempLiveData.value = CityTemp("上海", 28)
        }
    }
}