Android MVVM改進版 DataBinding+Retrofit+RxJava+ViewModel+LiveData(二)

 

 

上篇博客結尾說了一些問題,針對這些使用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控件的聲明週期問題,下一篇博客將對項目進行優化,使其更貼近實際項目。

項目地址:https://github.com/scYao/MVVMImprove

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章