




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】AndroidT-MVVM深度解耦开发框架
###前言自从官方mvp的Sample出来后,闹得热火朝天的mvp,小码也未能幸免加入MVP大坑中,入坑近2年的MVP的架构终于要说拜拜了,最近由于公司项目相对稳定,做了一次较大的重构,原来的MVP架构切换到了T-MVVM。整个项目清爽了许多。###问题MVP缺点:
*Presenter中除了逻辑以外,还有大量的View->Model,Model->View的逻辑操作,造成Presenter臃肿,维护困难。
*对UI的渲染放在了Presenter中,所以UI和Presenter的交互会过于频繁。
*Presenter过多地渲染了UI,往往会使得它与特定的UI的交互频繁。一旦UI变动,Presenter也需要变
*接口暴增,可以说代码量成倍增长,交互都需要通过接口传递信息,让人无法忍受.基本上用过mvp的码友们都能发现了以上诸多弊端。于是小码就尝试从传统的MVP过度到T-MVVM,深度结构,告别繁琐的接传递信息。如果项目业务不是很多或者业务相对简单,其实完全没有必要使用mvp,反而让项目变得更为复杂。###T-MVVM代码,如果有帮助记得star哦</SelfZhangTQ/T-MVVM>基于ViewModel,LiveData,Retrofit,Rxjava实现T-MVVM体系结构的架构,泛型限定,深度解耦。ViewModel优点:
*同步关联生命周期,
*数据共享,
*复用性强,
LiveData优点:
*确保UI界面的数据状态,
*没有内存泄漏,不会因为Activity的不可见导致Crash,
*不用再人为的处理生命周期,
*共享资源,此架构未使用DataBinding原由:*数据绑定增加Bug调试难度,
*复杂的页面,model也会很大,虽然使用方便了也很容易保证了数据的一致性,当时长期持有,不利于释放内存,
*数据双向绑定不利于View重用,###T-MVVM架构分层代码1:先定义BaseViewModel基类/**
*@author:tqzhangon18/7/2616:15
*/
publicclassBaseViewModel<TextendsBaseRepository>extendsAndroidViewModel{
publicTmRepository;
publicBaseViewModel(@NonNullApplicationapplication){
super(application);
mRepository=TUtil.getNewInstance(this,0);
}
@Override
protectedvoidonCleared(){
super.onCleared();
if(mRepository!=null){
mRepository.unSubscribe();
}
}
}BaseViewModel通过泛型类型参数BaseRepository子类初始化Repository数据仓库,同时在activity/fragment走onDestroy()生命周期方法时BaseViewModel回调onCleared,即页面销毁是用来取消网络请求或资源释放等操作。正常开发一般不建议直接通过ViewModel获取网络数据,这里我们将工作交给一个新的模块Repository。Repository只负责数据处理,提供干净的api,方便切换数据来源。2:再定义BaseRepositorypublicabstractclassBaseRepository{
protectedApiServiceapiService;
publicBaseRepository(){
if(null==apiService){
apiService=HttpHelper.getInstance().create(ApiService.class);
}
}
privateCompositeSubscriptionmCompositeSubscription;
protectedvoidaddSubscribe(Subscriptionsubscription){
if(mCompositeSubscription==null){
mCompositeSubscription=newCompositeSubscription();
}
mCompositeSubscription.add(subscription);
}
publicvoidunSubscribe(){
if(mCompositeSubscription!=null&&mCompositeSubscription.hasSubscriptions()){
mCompositeSubscription.clear();
}
}BaseRepository中内容相对简单,主要是获取ApiService和网络请求订阅容器,方便管理网络请求。3:然后自定义AbsLifecycleFragment基类继承BaseFragment,BaseFragment可自行编写。如不需要使用T-MVVM,可自行继承BaseFragment,互不影响。publicabstractclassAbsLifecycleFragment<TextendsBaseViewModel>extendsBaseFragment{
protectedTmViewModel;
/**
*initview
*@paramstate
*/
@Override
publicvoidinitView(Bundlestate){
mViewModel=VMProviders(this,TUtil.getInstance(this,0));
if(null!=mViewModel){
dataObserver();
}
}
/**
*createViewModelProviders
*
*@returnViewModel
*/
protected<TextendsViewModel>TVMProviders(BaseFragmentfragment,@NonNullClass<T>modelClass){
returnViewModelProviders.of(fragment).get(modelClass);
}
protectedvoiddataObserver(){
}
/**
*获取网络数据
*/
protectedvoidgetRemoteData(){
}
}在initView方法中通过BaseViewModel子类泛型类型参数获取Class<T>,在通过ViewModelProviders.of(fragment).get(modelClass))实例化ViewModel,到此我们的基类基本编写完毕。4:下面我们以一个简单业务实战下,获取文章列表。4-1:ArticleFragment/**
*@author:zhangtianqiuon18/7/214:40
*/
publicclassArticleFragmentextendsAbsLifecycleFragment<ArticleViewModel>{
protectedTRecyclerViewmRecyclerView;
protectedStaggeredGridLayoutManagerlayoutManager;
protectedMultiTypeAdapteradapter;
publicstaticArticleFragmentnewInstance(){
returnnewArticleFragment();
}
@Override
publicintgetLayoutResId(){
returnR.layout.fragment_list;
}
@Override
publicvoidinitView(Bundlestate){
super.initView(state);
layoutManager=newnewStaggeredGridLayoutManager(1,StaggeredGridLayoutManager.VERTICAL);
//获取网络数据
getRemoteData();
}
//初始化adapter
publicvoidinitAdapter(){
adapter=newMultiTypeAdapter.Builder<>()
.bindArray(ArticleInfoVo.class,newArticleRem1ItemHolder(context)
,newArticleRem2ItemHolder(context)
,newArticleRem3ItemHolder(context))
.bind(HeaderVo.class,newHeaderViewHolder(context,rogressStyle.Pacman))
.bind(FootVo.class,newFootViewHolder(context,ProgressStyle.Pacman))
.build();
//数据观察
@Override
protectedvoiddataObserver(){
mViewModel.getArticleList().observe(this,articleVo->{
if(null!=articleVo){
mRecyclerView.refreshComplete(articleVo.data.list,false);
}
});
}
//获取网络数据
@Override
protectedvoidgetRemoteData(){
mViewModel.getArticleList(typeId,lastId);
}
}我们可以看出来ArticleFragment中只有UI初始化,发请网络请求action以及数据观察更新UI,列表展示用了TRecyclerView,欢迎star哦面向holder开发高复用,多类型的刷新库,从此只关心你的列表的Item展示。通过泛型除去了MVP中通过接口传递信息的大量代码,从此seeyouMassimplementationofinterfaces。4-1:ArticleViewModel/**
*@author:tqzhangon18/7/2616:15
*/
publicclassArticleViewModelextendsBaseViewModel<ArticleRepository>{
privateMutableLiveData<ArticleVo>mArticleData;
publicArticleViewModel(@NonNullApplicationapplication){
super(application);
}
publicLiveData<ArticleVo>getArticleList(){
if(mArticleData==null){
mArticleData=newMutableLiveData<>();
}
returnmArticleData;
}
publicvoidgetArticleList(StringlectureLevel1,StringlastId){
mRepository.loadArticleRemList(newCallBack<ArticleVo>(){
@Override
publicvoidonNext(ArticleVoarticleObject){
mArticleData.postValue(articleObject);
}
@Override
publicvoidonError(Stringe){
}}
});
}ArticleViewModel中持有数据观察容器LiveData和真正发起网络请求动作,在接收到服务端返回的数据通过mArticleData.postValue(articleObject);通知Observer数据的更改,此处需注意的是,setValue方法只能在主线程中调用,postValue可以在任何线程中调用,如果是在后台子线程中更新LiveData的值,必须调用postValue。4-3:ArticleRepository/**
*@author:tqzhangon18/7/2813:00
*/
publicclassArticleRepositoryextendsBaseRepository{
publicvoidloadArticleRemList(finalCallBack<ArticleV
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程建设标准强制性条文房建部分考核试题试卷教案(2025-2026学年)
- 脊柱融合器材料改进行业跨境出海项目商业计划书
- 绿色混凝土企业制定与实施新质生产力项目商业计划书
- 沙发维修创新创业项目商业计划书
- 美容足疗结合创新创业项目商业计划书
- 能量脉动恢复饮料企业制定与实施新质生产力项目商业计划书
- 企业季度团队建设活动策划方案
- 项目管理中的风险预警机制
- 企业广告合同范本及常见法律问题
- 餐厅厨房卫生管理监督标准
- 《小学生新能源科普》课件
- 安全员安全巡查制度模版(2篇)
- 单位调动申请书范文
- 《县委书记的榜样【知识精研精析】焦裕禄》《在民族复兴的历史丰碑上》联读课件+【知识精研】统编版高中语文选择性必修上册
- 北师大版四年级上册数学教案-总复习第3课时 图形与几何
- DB21∕T 2483-2015 草原主要蝗虫预测预报技术规范
- 树木移植施工方案
- 钢结构栈道施工方案
- 【MOOC】航天推进理论基础-西北工业大学 中国大学慕课MOOC答案
- 预防艾滋病梅毒和乙肝母婴传播项目培训课件
- Unit-2-A-great-picture(课件)-二年级英语上学期(人教PEP版2024)
评论
0/150
提交评论