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