LiveData 是一个可以保存数据和观察数据变化的组件。他是被设计用来在ViewModel中保存数据,
但是同样也可以在应用的其他地方使用。
LiveData使用观察者模式监听数据的改变。这与RxJava的Observable非常类似,但是LiveData不止于此,LiveData是具有生命周期感知能力的。
简单的说,LiveData只是一个普通的数据类型,但是当数据发生变化时,它能够通知其观察者。
allprojects {
repositories {
jcenter()
google()
}
}
dependencies {
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.1"
// alternatively, just ViewModel
implementation "android.arch.lifecycle:viewmodel:1.1.1"
// alternatively, just LiveData
implementation "android.arch.lifecycle:livedata:1.1.1"
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
}
dependencies {
// Java8 support for Lifecycles
implementation "android.arch.lifecycle:common-java8:1.1.1"
}
可以把LiveData想象成一个可以与任何数据一起使用的包装器,包括集合对象,列如:List。LiveData对象通常存储在ViewModel对象中,并通过getter方法访问。
public class NameViewModel extends ViewModel {
// 创建一个包含String的LiveData
private MutableLiveData mCurrentName;
public MutableLiveData getCurrentName() {
if (mCurrentName == null) {
mCurrentName = new MutableLiveData();
}
return mCurrentName;
}
}
上面代码并没有给LiveDta设置Value,Value的来源可以是WebService或者本地数据库。
public class NameActivity extends AppCompatActivity {
private NameViewModel mModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 获取ViewModel实例
mModel = ViewModelProviders.of(this).get(NameViewModel.class);
// 创建更新UI的观察者
final Observer nameObserver = new Observer() {
@Override
public void onChanged(@Nullable final String newName) {
// 更新UI
mNameTextView.setText(newName);
}
};
// 观察LiveData
mModel.getCurrentName().observe(this, nameObserver);
}
}
上面代码展示了如果监听一个LiveData对象,并切如果LiveDta没有调用setValue
方法,那么onChanged
方法也不会回调。
如果观察者的生命周期处于STARTED
或RESUMED
状态,则LiveData会认为观察者处于活动状态。
public class StockLiveData extends LiveData<BigDecimal> {
private StockManager mStockManager;
private SimplePriceListener mListener = new SimplePriceListener() {
@Override
public void onPriceChanged(BigDecimal price) {
setValue(price);
}
};
public StockLiveData(String symbol) {
mStockManager = new StockManager(symbol);
}
@Override
protected void onActive() {
mStockManager.requestPriceUpdates(mListener);
}
@Override
protected void onInactive() {
mStockManager.removeUpdates(mListener);
}
}
上面例子中包含3个重要的方法:
onActive()
:当LiveData依附在observer上时调用onInactive()
:当LiveData不在依附在observer上时调用setValue(T)
:更新LiveData实例的值并通知观察者您可能想对存储在LiveData对象中的值进行更改后再分配给观察者,或者您可能需要根据另一个LiveData实例返回不同的LiveData实例。Lifecycle软件包提供Transformations类,其中就包括支持这些场景的方法。
Transformations.map()
在LiveData使用这个方法可以改变其下游的结果
LiveData userLiveData = ...;
LiveData userName = Transformations.map(userLiveData, user -> {
user.name + " " + user.lastName
});
Transformations.switchMap()
类似于map
,使用这个方法同样可以改变下游的结果,传递给switchMap()
的函数必须返回一个LiveData对象
private LiveData getUser(String id) {
...;
}
LiveData userId = ...;
LiveData user = Transformations.switchMap(userId, id -> getUser(id) );
https://developer.android.com/topic/libraries/architecture/livedata
Android架构组件(Architecture Components)介绍
Android架构组件—LiveData
Android架构组件—ViewModel
Android架构组件Room的使用