LiveData是一个可观察的数据持有者类。 与常规observable不一样,LiveData是生命周期感知的,当生命周期处于STARTED或RESUMED状态,则LiveData会将其视为活动状态,这意味着它尊重其余应用程序组件的生命周期,例如Activity,Fragment或Service。
LiveData具备如下优势:java
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能够在子线程处理。android
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对象。app
一般LiveData只关心观察者的STARTED或RESUMED状态,下面代码片断扩展了LiveDataide
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) } }
实现包括如下重要方法:post
class TestFragment : Fragment() { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) val stockLiveData = StockLiveData("") stockLiveData.observe(this, Observer { // update UI }) } }
observe() 方法将传递 Fragment(它是 LifecycleOwner 的实例)做为第一个参数。这样作表示此观察者绑定到与全部者关联的 Lifecycle 对象,这意味着:gradle
固然能够在多个 Activity、Fragment 和 Service 之间共享它们,只须要把 StockLiveData类实现为单例。this
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 对象。code