教你如何用android mvp分层架构优雅写代码

背景看了好多Android技术博客,写android分层架构的博客越来越多,有mvc、mvp、mvvm、clean等各式各样的,而mvp异常火热,然而每个人对mvp的定义又是不同,写法自然也是千紫万红 。
目的写一个实用分层清晰的mvp架构
主题mvp无非 model(数据)、view(界面)、presenter(逻辑) 。model对应本地持久化或远程服务端数据,而在笔者看来其实就是对应一个bean对象,然而这个bean对象由远程服务器或本地持久化而得到,因而此层需封装网络请求和本地持久化;view对应activity、fragment以及它们对应的xml布局文件,这层只负责做ui显示;presenter对应逻辑处理层,所做的事情很多,包括网络请求操作、读取缓存数据操作、算法计算等等 。
接下来写代码来分析笔者认为优雅的mvp分层架构,开始看一下项目分组,如下图所示:

教你如何用android mvp分层架构优雅写代码

文章插图
 
从上图我们看到module下有四个分组,分别对应:contract、model、presenter、views 。相信大部分童鞋对contract有点疑惑,这个分组是干啥用的呢?contract是作为契约,目的是将presenter、views等接口集中关联起来,便于统一管理 。
教你如何用android mvp分层架构优雅写代码

文章插图
 
打开契约分组,我们看到四个接口和一个类,分别为IActivityLifeCycle(Activity生命周期接口类)、IBaseActivity(Activity接口基类 界面层的)、IBaseFragment(Fragment接口基类 界面层的)、IBasePresenter(逻辑层基类 逻辑层的)、UserInfoContract(用户信息契约类,关联view层与presenter层接口,方便统一管理) 。
IActivityLifeCycle代码如下:
【教你如何用android mvp分层架构优雅写代码】/** * @className: IActivityLifeCycle * @classDescription: 生命周期接口(为了实现Activity UI层生命周期映射到逻辑层) * @author: leibing * @createTime: 2016/8/11 */public interface IActivityLifeCycle {void onCreate();void onRestart();void onStart();void onResume();void onPause();void onStop();void onDestroy();}IActivityLifeCycle 作为一个activity生命周期接口,为了将activity生命周期映射到对应presenter层,便于逻辑层能更好的处理跟activity生命周期有关的事件 。
IBaseActivity代码如下:
package com.ym.mvpdemo.module.contract;/** * @className: IBaseActivity * @classDescription: activity接口基类 * @author: leibing * @createTime: 2016/8/11 */public interface IBaseActivity<T> {// 设置逻辑void setPresenter(T mIActivityPresenter);// 设置生命周期void setILifeCycle(IActivityLifeCycle mIActivityLifeCycle);}IBaseActivity作为一个view层的activity接口基类,主要是设置逻辑层和设置生命周期,将逻辑层与界面层绑定起来,将activity生命周期映射到逻辑层去 。
IBaseFragment代码如下:
package com.ym.mvpdemo.module.contract;/** * @className:IBaseFragment * @classDescription:Fragment接口基类 * @author: leibing * @createTime: 2016/8/12 */public interface IBaseFragment<T> {// 设置逻辑void setPresenter(T mIFragmentPresenter);}IBaseFragment作为一个view层的fragment接口基类,主要是设置逻辑层,将逻辑层与界面层绑定起来 。
IBasePresenter代码如下:
package com.ym.mvpdemo.module.contract;/** * @className: IBasePresenter * @classDescription: 逻辑层基类 * @author: leibing * @createTime: 2016/8/11 */public interface IBasePresenter {// 逻辑层开始执行方法void start();}IBasePresenter作为一个逻辑层基类,主要做界面层与逻辑层绑定之后,逻辑层初始化工作 。
UserInfoContract比较重要,大家仔细看看,代码如下:
package com.ym.mvpdemo.module.contract;import com.ym.mvpdemo.module.model.UserInfoModel;/** * @className: UserInfoContract * @classDescription: 用户信息契约类 * @author: leibing * @createTime: 2016/8/11 */public class UserInfoContract {/*** 用户信息activity中用于更新UI的方法集合* @interfaceName: IUserInfoActivity* @interfaceDescription: View接口* @author: leibing* @createTime: 2016/08/23*/public interface IUserInfoActivity extends IBaseActivity<IUserInfoActivityPresenter> {void showLoading();//展示加载框void dismissLoading();//取消加载框展示void showUserInfo(UserInfoModel userInfoModel);//将网络请求得到的用户信息回调String loadUserId();//假设接口请求需要一个userId}/*** 用户信息Fragment中用于更新UI的方法集合* @interfaceName: IFragment* @interfaceDescription: Fragment接口* @author: leibing* @createTime: 2016/08/23*/public interface IUserInfoFragment extends IBaseFragment<IUserInfoFragmentPresenter> {void showData(); // 假定显示数据}/*** 用户信息activity逻辑层需要使用的方法集合* @interfaceName: IUserInfoActivityPresenter* @interfaceDescription: 用户信息Activity逻辑层接口* @author: leibing* @createTime: 2016/08/23*/public interface IUserInfoActivityPresenter extends IBasePresenter {void loadUserInfo();}/*** 用户信息Fragment逻辑层需要使用的方法集合* @interfaceName: IUserInfoFragmentPresenter* @interfaceDescription: 用户信息Fragment逻辑层接口* @author: leibing* @createTime: 2016/08/23*/public interface IUserInfoFragmentPresenter extends IBasePresenter {void loadData();}}


推荐阅读