【移动应用开发技术】Android T-MVVM深度解耦开发框架_第1页
【移动应用开发技术】Android T-MVVM深度解耦开发框架_第2页
【移动应用开发技术】Android T-MVVM深度解耦开发框架_第3页
【移动应用开发技术】Android T-MVVM深度解耦开发框架_第4页
【移动应用开发技术】Android T-MVVM深度解耦开发框架_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论