LiveData is an observable data holder class. Unlike a regular observable, LiveData is lifecycle-aware, meaning it respects the lifecycle of other app components, such as activities, fragments, or services. This awareness ensures LiveData only updates app component observers that are in an active lifecycle state. Source:developer.android.com/topic/libra…html
The ViewModel class is designed to store and manage UI-related data in a lifecycle conscious way. The ViewModel class allows data to survive configuration changes such as screen rotations. Source:developer.android.com/topic/libra…java
implementation "android.arch.lifecycle:extensions:1.1.1"
android
extensions库中包含的内容以下:git
public class MainBean {
public DataBean data;
public static class DataBean {
public String name;
}
}
复制代码
public MutableLiveData<MainBean> getData(int id) {
//构造须要暴露的数据结构
final MutableLiveData<MainBean> liveData = new MutableLiveData<>();
//获取数据
MainApiService mainApiService = retrofit.create(MainApiService.class);
Call<MainBean> call = mainApiService.getData(id);
call.enqueue(new Callback<MainBean>() {
@Override
public void onResponse(Call<MainBean> call, Response<MainBean> response) {
//设置数据
if (response.isSuccessful()) {
liveData.setValue(response.body());
} else {
liveData.setValue(null);
}
}
@Override
public void onFailure(Call<MainBean> call, Throwable t) {
liveData.setValue(null);
}
});
//返回数据
return liveData;
}
复制代码
若是View层须要直接操做MainBean,能够这样处理:github
public LiveData<MainBean> getData() {
return mainRepository.getData();
}
复制代码
若是View层只须要name字段,用于显示名字,能够这样处理:数据结构
public LiveData<String> getData() {
int id = 1;
final MutableLiveData<MainBean> liveData = mainRepository.getData(id);
//执行数据转换操做并得到转换后的数据
LiveData<String> newLiveData = Transformations.switchMap(liveData, new Function<MainBean, LiveData<String>>() {
@Override
public LiveData<String> apply(MainBean mainBean) {
final MutableLiveData<String> newLiveData = new MutableLiveData<>();
if (mainBean == null || mainBean.data == null) {
newLiveData.setValue(null);
} else {
newLiveData.setValue(mainBean.data.name);
}
return newLiveData;
}
});
//返回转换后的数据
return newLiveData;
}
复制代码
mainViewModel.getData().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
mainFragmentText.setText(s);
}
});
复制代码
上面的LiveData组件的核心实际上就是Lifecycle,好比咱们想要监听Acitivity等组件的生命周期,就可使用该类实现,下面介绍一下如何使用:架构
public class LifecycleActivity extends FragmentActivity implements LifecycleRegistryOwner {
private LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);
@NonNull
@Override
public LifecycleRegistry getLifecycle() {
return lifecycleRegistry;
}
}
复制代码
public class ActivityLifecycleObserver implements LifecycleObserver {
private static final String TAG = "ActivityObserver";
private Context context;
public ActivityLifecycleObserver(Context context) {
this.context = context;
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate() {
Log.d(TAG, "onCreate");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
Log.d(TAG, "onStart");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
Log.d(TAG, "onResume");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
Log.d(TAG, "onPause");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
Log.d(TAG, "onStop");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
Log.d(TAG, "onDestroy");
}
//任意回调都会调用它,好比调用完onCreate()后会回调这里的onCreate(),而后会回调onAny();
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
public void onAny() {
Log.d(TAG, "onAny");
}
}
复制代码
getLifecycle().addObserver(new ActivityLifecycleObserver(getApplicationContext()));
复制代码
LifeCycle目前只写到这里,尚未继续深刻,继续努力中...app