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