上篇博客結尾說了一些問題,針對這些使用ViewModel和LiveData,項目只是在上個項目上進行修改,如果不熟悉的話請看上篇博客Android MVVM基礎版 DataBinding+Retrofit+RxJava(一)
一、知識準備
ViewModel和LiveData是相輔相成的,VIewModel用來存儲和和管理UI相關的數據,LIveData是一個有生命週期的被觀察的數據持有者,只有當UI組件活着的時候它纔會更。
ViewModel具體的介紹和使用請查看文檔:https://developer.android.google.cn/topic/libraries/architecture/viewmodel
LiveData具體的介紹和使用請查看文檔:https://developer.android.google.cn/topic/libraries/architecture/livedata
(小夥伴們儘量開英文文檔,看不懂的話可以找類似中文文檔看一下,應該對大多數人來說,只是部分單詞不認識,有百度翻譯了,多看幾遍,慢慢就習慣了,希望各位堅持)、
二、項目修改部分
2.1model部分
MainRepository部分修改getList()方法返回MutableLiveData對象將原來ViewModel中的觀察者遷移過來,這樣ViewModel只需要獲取數據源即可,更貼近MVVM;
public class MainRepository extends BaseRepository {
public MutableLiveData<BaseBean<List<PublicNumberBean>>> getList() {
final MutableLiveData<BaseBean<List<PublicNumberBean>>> data = new MutableLiveData<>();
apiService.getList().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BaseBean<List<PublicNumberBean>>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(BaseBean<List<PublicNumberBean>> listBaseBean) {
if (listBaseBean !=null){
data.setValue(listBaseBean);
}
}
@Override
public void onError(Throwable e) {
data.setValue(null);
}
@Override
public void onComplete() {
}
});
return data;
}
2.2ViewModel部分
讓MainViewModel繼承AndroidViewModel,也可以繼承ViewModel,AndroidViewModel繼承ViewModel,可以使用Application。
MainViewModel的getList()方法 獲取數據並返回一個LiveData對象給MainActivity。
public class MainViewModel extends AndroidViewModel {
private MainRepository repository = new MainRepository();
private MutableLiveData<BaseBean<List<PublicNumberBean>>> mutableLiveData;
public MainViewModel(@NonNull Application application) {
super(application);
}
public LiveData<BaseBean<List<PublicNumberBean>>> getList() {
if (mutableLiveData == null) {
mutableLiveData = repository.getList();//獲取數據
}
return mutableLiveData;
}
}
2.3View部分
showWaitDialog();//顯示加載動畫
viewModel.getList().observe(this, new Observer<BaseBean<List<PublicNumberBean>>>() {
@Override
public void onChanged(@Nullable BaseBean<List<PublicNumberBean>> listBaseBean) {
if (listBaseBean.getErrorCode() ==0){
dismissWaitDialog();//關閉加載圖
adapter.setData(listBaseBean.getData());
}
}
});
三、總結
這樣就不用考慮UI控件的聲明週期問題,下一篇博客將對項目進行優化,使其更貼近實際項目。