Android架构系列-基于MVP创建适合自己的架构

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Android架构系列-基于MVP创建适合自己的架构1为什么选择MVPMVP架构是当前比较成熟的Android架构,还有其他架构比如最初始的MVC和MVVM。MVC相对于较为落后,MVVM使用DataBind,普及性不如MVP。所以最终决定自己设计的框架是基于MVP思想进行总结的框架。选择MVP框架的原因之一也是google官方的示例中MVPsample已经是完成,证明google官方对于MVP的承认度。官方项目地址:一个较为详细的官方项目源码解析的文章:简介具体的MVP架构相关文章网上已经非常多了,具体的可以自行查找。MVP的存在主要是由于普通MVC架构会导致项目中activity过于臃肿,当项目越来越大后,代码可读性大大降低。MVP的思想是将activity作为view层,只负责与xml的渲染和监听事件,具体处理数据逻辑放到一个新定义的Present层。减少了activity负责的事情。并且可以强迫开发者养成分模块功能开发的思想。开发前设计好功能模块,而不是像以前一样写流水账一样写代码。从头写到尾。MVP3我的总结自己根据MVP的思想和一些好的源码总结了一套适合字的框架。真正的架构是依赖义务存在的,所以建议大家能总结出适合自己项目的代码。3.1目录分配在目录分配上决定采用根据功能模块进行划分,而不是所有activty在一个目录的方法。类似google的例子:目录原因几点:1.功能模块划分更为清晰,对于以后代码阅读和新人接手更好2.适用于模块化开发,比如以后又是一个新项目,老项目的登录模块、用户模块、论坛模块等待可以整个复制出来重用3.虽然网上提过按照多个模块划分可能会有公用的页面。我认为复制一份也没什么,不会造成很大的冗余代码,并且对于页面来说万一以后某个模块页面有自定义修改不会对其他影响。(毕竟页面的灵活性要求很高,不适合架构抽出来通用的)4.需要抽出来的独立于功能模块的应该是common_util和common_widget,分别是通用工具层和通用自定义控件层具体例子分配如下:Sample目录GloabApp全局ApplicationRootAct启动页面Base目录基础activityfragment存放util目录通用工具mywidget通用自定义控件SampleModuleSample功能模块。里面包含独立的MVP的接口3.2Model层Model层中又可以分为Api层和Cache层。3.2.1Api层主要是网络获取数据信息等接口。使用了自己二次封装过的Retrofit+Okhttp+Gson组合。详细可以参见文章:示例SampleApi:publicclassSampleApiextendsBaseApi{privatestaticfinalStringmBaseUrl=(){super(mBaseUrl);mApiStore=mRetrofit.create(ApiStore.class);}/***获取xxx数据*@paramuid*@paramcallback*/publicvoidgetSampleInfo(Stringuid,ApiCallbackGetSampleInfoRetcallback){CallGetSampleInfoRetcall=((ApiStore)mApiStore).getSampleInfo(uid);call.enqueue(newRetrofitCallbackGetSampleInfoRet(callback));}publicinterfaceApiStore{@FormUrlEncoded@POST(test_retrofit.php)CallGetSampleInfoRetgetSampleInfo(@Field(uid)Stringuid);}}3.2.2Cache层本地缓存部分数据。使用了ASimpleCache缓存开源代码。详细可以参见文章:示例SampleCache:publicclassSampleCacheextendsBaseCache{privatefinalStringKEY_NEWEST_SAMPLE_INFO=sample_newest_info;publicSampleCache(Contextcontext){super(context);}/***保存sample信息*@paramserializable*/publicvoidsaveNewestSample(Serializableserializable){mCache.put(KEY_NEWEST_SAMPLE_INFO,serializable);}/***获取sample信息*@return*/publicSampleInfogetNewestSampleInfo(){return(SampleInfo)mCache.getAsObject(KEY_NEWEST_SAMPLE_INFO);}/***移除缓存*/publicvoidremoveNewestSampleInfo(){mCache.remove(KEY_NEWEST_SAMPLE_INFO);}}3.3Data层实体化数据类。3.4Presenter层Presenter层又可以分为Contract协议接口,和具体的Presenter处理3.4.1Contract层负责约定view层和presenter层的接口,view和presenter实现相应接口,最终达到解耦的目的。SampleContract示例:publicinterfaceSampleContract{interfaceView{voidshowSample(SampleInfosampleInfo);//显示samplevoiderrorGetSample(Stringmsg);//显示错误信息}interfacePresenter{voidgetNewestSample();//获取当前最新的xxx}}3.4.2Presenter层负责从model层获取数据、整理数据、行为处理等。处理后调用view显示数据。SamplePresenter示例:publicclassSamplePresenterextendsBasePresenterimplementsSampleContract.Presenter{privateSampleContract.ViewmView;privateSampleApimApi;privateSampleCachemCache;publicSamplePresenter(SampleContract.Viewview){mView=view;mApi=newSampleApi();mCache=newSampleCache(GlobalApp.getInstance().getContext());}@OverridepublicvoidgetNewestSample(){//先从缓存获取SampleInfosampleInfo=mCache.getNewestSampleInfo();if(sampleInfo==null){//从网络获取mApi.getSampleInfo(uid,newBaseApi.ApiCallbackGetSampleInfoRet(){@OverridepublicvoidonSuccess(GetSampleInfoRetret){//缓存mCache.saveNewestSample(ret.data);//页面显示mView.showSample(ret.data);}@OverridepublicvoidonError(interr_code,Stringerr_msg){//服务端返回错误码mView.errorGetSample(err_msg);}@OverridepublicvoidonFailure(){//网络请求或者解析错误mView.errorGetSample(服务器请求错误);}});}else{mView.showSample(sampleInfo);}}}3.5view层即平时所说的activity、fragment等。继承自SampleContract的view接口,只负责UI相关显示刷新等。由于拉出了presenter层,view层的代码变得极为清晰SampleActivity示例:publicclassSampleActivityextendsBaseActivityimplementsSampleContract.View{@BindView(R.id.txtName)TextViewtxtName;@BindView(R.id.imgAvatar)ImageViewimgAvatar;privateSampleContract.PresentermPresenter;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_sample);ButterKnife.bind(this);mPresenter=newSamplePresenter(this);}@OverridepublicvoidshowSample(SampleInfosampleInfo){txtName.setText(sampleInfo.sample_name);Glide.with(this).load(sampleInfo.avatar).into(imgAvatar);}@OverridepublicvoiderrorGetSample(Stringmsg){//错误信息}}4总结以上代码Github地址:

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功