标签:ice 实例 live star sum 关心 com 更新 fun
LiveData是一个可观察的数据持有者类。 与常规observable不同,LiveData是生命周期感知的,当生命周期处于STARTED或RESUMED状态,则LiveData会将其视为活动状态,这意味着它尊重其他应用程序组件的生命周期,例如Activity,Fragment或Service。
LiveData具有以下优点:
def lifecycle_version = "2.0.0"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
class TestViewModel : ViewModel() {
private lateinit var userName: MutableLiveData<String>
fun getUserName(): MutableLiveData<String> {
if (!::userName.isInitialized) {
userName = MutableLiveData()
loadUsers()
}
return userName
}
private fun loadUsers() {
userName.value = "test"
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var model = ViewModelProviders.of(this).get(TestViewModel::class.java)
model.getUserName().observe(this, Observer {
txt_test.text = it
})// 观察
btn_test.setOnClickListener {
model.getUserName().value = "test 2"
}// 变更
}
}
在变更数据的使用有两种方式可用,一个是setValue,另外一个是postValue,区别是setValue只能在主线程处理,postValue可以在子线程处理。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
var model = ViewModelProviders.of(this).get(TestViewModel::class.java)
binding.let {
it.data = model
it.setLifecycleOwner(this)
}
btn_test.setOnClickListener {
model.getUserName().value = "test 2"
}
}
}
binding对象需要调用setLifecycleOwner(LifecycleOwner lifecycleOwner)设置lifecycleOwner对象。
通常LiveData只关心观察者的STARTED或RESUMED状态,下面代码片段扩展了LiveData
class StockLiveData(symbol: String) : LiveData<BigDecimal>() {
private var mStockManager: StockManager? = null
private val mListener = object : SimplePriceListener() {
fun onPriceChanged(price: BigDecimal) {
value = price
}
}
init {
mStockManager = StockManager(symbol)
}
override fun onActive() {
mStockManager.requestPriceUpdates(mListener)
}
override fun onInactive() {
mStockManager.removeUpdates(mListener)
}
}
实现包括以下重要方法:
class TestFragment : Fragment() {
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val stockLiveData = StockLiveData("")
stockLiveData.observe(this, Observer {
// update UI
})
}
}
observe()?方法将传递 Fragment(它是?LifecycleOwner?的实例)作为第一个参数。这样做表示此观察者绑定到与所有者关联的?Lifecycle?对象,这意味着:
当然可以在多个 Activity、Fragment 和 Service 之间共享它们,只需要把 StockLiveData类实现为单例。
LiveData?对象分派给观察者之前对存储在其中的值进行更改,或者您可能需要根据另一个实例的值返回不同的?LiveData?实例。其提供了以下方法进行转换
LiveData<User> userLiveData = ...;
LiveData<String> userName = Transformations.map(userLiveData, user -> {
? ? user.name + " " + user.lastName
});
LiveData<String> userId = ...;
LiveData<User> user = Transformations.switchMap(userId, id -> getUser(id) );
要实现您自己的转换,可以使用?MediatorLiveData?类,该类可以监听其他?LiveData?对象并处理它们发出的事件,其可以正确地将其状态传播到源?LiveData?对象。
标签:ice 实例 live star sum 关心 com 更新 fun
原文地址:https://www.cnblogs.com/fomin/p/10490816.html