Google官方架构MVP解析与实战进阶必学系列

1 前言

当然对于MVP的解说也是使用也是层出不穷,我也网络上也能看到各种版本的解说,之前博客也有文章的更新,里面有MVP的详细说明和项目代码--->Android中的MVP模式,带实例。

本篇文章将参考 google官方android MVP架构项目的实现,来实现自己的项目。或许看了这篇文章之后,你再去梳理一下google官方架构项目,会让你收获更多。官方的实例肯定具有更好的权威性。

推荐关注安卓各种架构相关文章合集github地址:AndroidArchitectureCollection

2 google官方MVP架构解析

1 项目目录

打开github,展开项目目录,会发现项目结构的组织方式是按照功能进行分模块的,当然根据个人情况,也可以按照ui,model,view,presenter这种情况进行划分组织目录。

Google官方架构MVP解析与实战进阶必学系列
google官方MVP架构目录视图

2 具体实现流程我们将关注度放到具体的一个taskdetail模块当中来解析实现MVP的流程。

Google官方架构MVP解析与实战进阶必学系列
taskdetail模块

2.1 TaskDetailContract

可以看到这里是通过一个协议类XXXContract来对View和Presenter的接口进行继承。这样做的好处也就是,我们可以将基础的View层的操作放在BaseView里面,对基础的Presenter层的操作放在BasePresenter里面。减少后续代码的重复。一个协议类也将View和Presenter管理起来,方便操作。

Google官方架构MVP解析与实战进阶必学系列
2.2 BaseView

那么来看看BaseView,主要是有一个setPresenter的操作,MVP中Presenter和View层是需要交互的,这里通过setPresenter操作,我们也就可以获得相应的Presenter的实例在View层直接mPresenter.xxx()进行交互了。我们可以在下面的代码中看到官方示例代码是通过在TaskDetailPresenter的构造函数中调用mTaskDetailView.setPresenter(this)完成这一步操作的。所以在我们自己的代码中,我们也可以将加载的loading,以及加载错误页面,加载失败页面等操作放在BaseView里面,这是每个View都会有的:

Google官方架构MVP解析与实战进阶必学系列
2.3 BasePresenter

BasePresenter中只有一个start方法,表示“开始”,我们可以在这里进行数据加载初始化等。

Google官方架构MVP解析与实战进阶必学系列
2.3 TaskDetailActivity

可以看到这里这里一个初始化了fragment的activity,主要操作当让是new了一个XXXPresenter。activity在项目中是一个全局的控制者,负责创建view以及presenter实例,并将二者联系起来,

Google官方架构MVP解析与实战进阶必学系列
2.4 TaskDetailFragment

Fragment是MVP中View的实现类,它不与Model 层进行交互,只和presenter的实例进行交互。

Google官方架构MVP解析与实战进阶必学系列
2.5 TaskDetailPresenter

Presenter的真正实现类,在这里进行model层和view层的交互。

Google官方架构MVP解析与实战进阶必学系列
通过上面的分析,在来梳理一下整个步骤:

1 官方MVP实例,通过协议类XXXContract来对View和Presenter的接口进行内部继承。是对BaseView和BasePresenter的进一步封装,所以我们实现的View和Presenter也只需要继承XXXContract中的对应内部接口就行。

2 activity的作用主要是创建View(这里是相应的fragment),以及创建presenter,并把view传递给presenter(完成presenter对view实例关联操作)

3 在presenter的实现类的构造函数中,通过view的setPresenter,让view获得了presenter实例。这样view中就可以对Presenter中的方法进行操作了。(完成view对presenter实例关联操作)

4 在presenter的实现类中,可以对Model数据进行操作。实例中,数据的获取、存储、数据状态变化都是model层的任务,presenter会根据需要调用该层的数据处理逻辑并在需要时将回调传入。这样model、presenter、view都只处理各自的任务,此种实现确实是单一职责最好的诠释。

3 实战应用:

说了这么多,通过一个一个最为简单的spalsh页面的搭建,来完整的使用MVP吧。

3.1 BaseView

我在这里没有添加setPresenter方法,而是将loading,以及加载错误,网络加载错误等页面都放在了这里面。

/**

  • Created by Anthony on 2016/5/3.
  • Class Note:
  • interface for MVP View in all of the project
    */
    public interface BaseView {
    void showMessage(String msg);
    void close();
    void showProgress(String msg);
    void showProgress(String msg, int progress);
    void hideProgress();
    void showErrorMessage(String msg,String content);
    }
    3.2 BasePresenter

在我的项目中,我采用的是在BasePresenter中获取View的实例,也就是通过下面的attachView方法完成了View和Presenter的关联性。

public interface BasePresenter<T extends BaseView> {
void attachView(T view );
void detachView();
}
这个方法会在相应的Presenter的实现类里面得到实现。而我们需要通过在相应的View类里面通过mPresenter.attachView(this)进行初始化关联,这样就可以在Presenter的实例中使用View的实例。那么上面这个mPresenter实例我是怎么在View的实现类中得到的呢? 答案是使用Dagger2的Inject获取。可以参考我的文章Google官方MVP+Dagger2架构详解 进行Dagger2的学习。

@Inject
SplashPresenter mPresenter;
3.3 SplashContract

同样的我们也将采用契约类来完成Presenter和View接口的展现。这里Presenter主要是完成加载数据(在splash页面中加载数据是应用普遍应当考虑的一种方式。)

/**

  • Created by Anthony on 2016/5/31.
  • Class Note:
  • contract class for splash view & presenter
    */
    public interface SplashContract {
    interface Presenter extends BasePresenter<View> {
    void initData();
    }
    interface View extends BaseView {
    void toMainActivity();
    }
    }
    3.4 SplashContract.View的实现SplashActivity

官方示例代码采用的方式是fragment作为View的实现,这里灵活变通,采用Activity作为MVP中View的实现。这里继承自AbsBaseActivity其中完成了一些初始化操作,将会在另外的文章中进行讲解。这里我们就采用Dagger2进行了SplashPresenter的实例的获取。也实现了toMainActivity方法,用于跳转到主页面。

/**

这里对Presenter的实现类是SplashPresenter,我们需要实现的方法自然有三个attachView,detachView,以及initData三个方法。

/**

1 细心的你可能会发现,那么上面的所有BaseView的方法在哪里实现呢?

答案是所有Activity都需要继承的AbsBaseActivity中

Google官方架构MVP解析与实战进阶必学系列
这样我们就可以让所有activity继承AbsBaseActivity,他们都是实现了BaseView的所有方法的状态。这样就提供了统一的界面化处理而且减去了许多重复的代码。

2 上面无论是官方的代码还是我们自己的代码,由于使用MVP模式,都会降低模块之间的耦合性。所以这时候能够正确的关联View,Presenter和Model层之间的数据显得尤为的重要。

3 对于Model层的数据,我们可以看到我是在initData方法中调用DataManger的loadChannelList进行数据的加载的。关于Model层这方面的内容,已经在文章浅析MVP中model层设计 进行了分析,不再赘述。

写在最后:

码字不易看到最后了,那就点个关注呗,只收藏不点关注的都是在耍流氓!

关注并私信我“架构”,免费送一些Java架构资料,先到先得!

Google官方架构MVP解析与实战进阶必学系列

原文地址:https://blog.51cto.com/14233733/2399710

时间: 2024-10-03 16:10:16

Google官方架构MVP解析与实战进阶必学系列的相关文章

google官方架构MVP解析与实战-(从零开始搭建android框架系列(3))

最近更新2016.5.10(已经添加整个项目目录.更新新闻资讯) 本篇文章项目github地址:MVPCommon 本文章原地址:简书博客 1 前言 当然对于MVP的解说也是使用也是层出不穷,我也网络上也能看到各种版本的解说,之前博客也有文章的更新,里面有MVP的详细说明和项目代码->Android中的MVP模式,带实例. 本篇文章将参考 google官方android MVP架构项目的实现,来实现自己的项目.或许看了这篇文章之后,你再去梳理一下google官方架构项目,会让你收获更多.官方的实

Google官方MVP模式示例项目解析 todo-mvp

转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6700668.html 引言:在Google没有给出一套权威的架构实现之前,很多App项目在架构方面都有或多或少的问题.第一种常见问题是没有架构,需求中的一个页面对应项目中的一个activity或一个fragment,所有的界面响应代码.业务逻辑代码.数据请求代码等等都集中在其中.第二种常见的问题是架构实现的不断变化,不断在各种架构间摇摆,一直找不到一个适合自己的架构. Google官方示例项目地址 ht

MVP学习笔记——参考Google官方demo

demo地址:https://github.com/googlesamples/android-architecture 在这个项目里,每个包的分工都很明确,大体上来说,一个包会对应一个界面.一个界面就会对应一个MVP. M:还是模型层和业务层 V:视图层.Activity或者Fragment,在这份代码里面,Google是把Fragment当作一个V,而不是Activity P:Prensenter,用来控制V. 按我的理解是,MVP主要就是通过P来解耦M和V,P用来沟通M和V,使得两者不必直

Activiti6.0工作流引擎深度解析与实战|activiti6视频教程

Activiti6.0工作流引擎深度解析与实战网盘地址:https://pan.baidu.com/s/1aqGADN23lUKzcwkbTaV90g 密码: xmj5备用地址(腾讯微云):https://share.weiyun.com/5Z7sAqb 密码:8pwrkb 工作流引擎驱动业务正在互联网公司中盛行,越来越多的互联网公司开始采用工作流引擎的方式来适应业务的快速变化. 本课程将系统且深入源码讲解Activiti6.0工作流引擎的使用.配置.核心api以及BPMN2.0规范.数据库设计

Android官方架构组件:Lifecycle详解&amp;迪士尼彩乐园平台搭建原理分析

在过去的谷歌IO大会上,Google官方向我们推出了 Android Architecture Components,其中谈到Android组件处理生命周期的问题,向我们介绍了 Handling Lifecycles. 同时,如何利用 android.arch.lifecycle 包提供的类来控制数据.监听器等的 lifecycle.同时,LiveData 与 ViewModel 的 lifecycle 也依赖于 Lifecycle 框架. 经过公司内部的技术交流小组的探讨后,不少小伙伴觉得这个

大中型网站集群架构企业级高标准全自动实战项目征集

大中型网站集群架构企业级高标准全自动实战 发布本博文目标: 老男孩教育全新期中集群架构项目实战(老男孩老师亲自带队) 1)征集网友或老男孩教育学生资源3-5人. 2)树立老男孩教育运维班期中集群架构项目标杆(期末的的架构会更精彩) 3)共同完成老男孩老师第一本书的结尾项目实战项目. 4)将结合23期运维班毕业前的期末架构项目出书(全自动化大型网站集群搭建优化) 5)让支持老男孩教育网友或老男孩教育学生得到锻炼和成长.享受出书作者待遇. 具体项目将以10台左右VM资源进行部署和演示,规模可以扩展到

Android Google官方文档解析之——System Permissions

Android is a privilege-separated operating system, in which each application runs with a distinct system identity (Linux user ID and group ID). Parts of the system are also separated into distinct identities. Linux thereby isolates applications from

Google官方 详解 Android 性能优化【史诗巨著之内存篇】

尊重博主原创,如需转载,请附上本文链接http://blog.csdn.net/chivalrousman/article/details/51553114#t16 为什么关注性能 对于一款APP,用户首先关注的是 app的性能,而不是APP本身的属性功能,用户不关心你是否是搞社交,是否搞电商,是否是一款强大的美图滤镜app,用户首先关注的是 性能--性能不好,用户会直接卸载,在应用市场给一个恶狠狠得差评,小则影响产品口碑,大则影响公司的品牌和声誉,作为程序员,app的性能更应该作为我们关注的一

Web安全测试中常见逻辑漏洞解析(实战篇)

Web安全测试中常见逻辑漏洞解析(实战篇) 简要: 越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改查的时候没有进行一个判断,判断所需要操作的信息是否属于对应的用户,导致用户A可以操作其他人的信息.? 逻辑漏洞挖掘一直是安全测试中"经久不衰"的话题.相比SQL注入.XSS漏洞等传统安全漏洞,现在的攻击者更倾向于利用业务逻辑层的应用安全问题,这类问题往往危害巨大,可能造成了企业的资产损失和