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>> getList() {
        final MutableLiveData>> data = new MutableLiveData<>();

        apiService.getList().subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer>>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(BaseBean> 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>> mutableLiveData;

    public MainViewModel(@NonNull Application application) {
        super(application);
    }

    public LiveData>> getList() {
        if (mutableLiveData == null) {
            mutableLiveData = repository.getList();//获取数据
        }
        return mutableLiveData;
    }


}

2.3View部分

  showWaitDialog();//显示加载动画
        viewModel.getList().observe(this, new Observer>>() {
            @Override
            public void onChanged(@Nullable BaseBean> listBaseBean) {
                if (listBaseBean.getErrorCode() ==0){
                    dismissWaitDialog();//关闭加载图
                    adapter.setData(listBaseBean.getData());
                }

            }
        });

三、总结

这样就不用考虑UI控件的声明周期问题,下一篇博客将对项目进行优化,使其更贴近实际项目。

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

你可能感兴趣的:(Android)