前言想着互联网公司基本上都有现成的项目,最实际的就是修改原来的代码,增加功能。于是***加入了一家规模不大的外包公司,想体验一个商业项目从落地到成型的过程。进入公司后,我被分配到一个国外承包商的项目(我只是一个新实习生,我的第一个项目是为一个外国人做的,好吗?)。作为一个有Android开发经验的菜鸟,在各种服务外包比赛中也拿过一些奖(虽然大学里这种比赛很不错,但是开发工作还是有的,哈哈),我对一个项目很感兴趣组成,如何发展等等,都有一定的了解。由于之前有比赛项目的经验,Android端是自己独立开发的,所以项目的结构和框架尽量顺手,代码的可读性和复用性没怎么考虑(进入后去公司实习,才发现这些东西很重要)。为了方便,我把业务逻辑和视图绑定放到了Activity类中,导致Activity类过于臃肿,给代码的阅读和修改带来了很大的麻烦。造成了极大的不便,但由于自己没有项目经验,一开始给自己挖的坑,不仅难以填满,而且越挖越深(一只手捂住眼睛笑哭.jpg),还好是我自己开发的,不然合作开发的话估计要被朋友锤了。进入公司后,从Android开发组组长那里得到了项目的基本开发框架。以我六级测试的水平来看,嗯,这个presenter应该在书上见过。MVP里的P还不错。从网上找资料学习。入题。MVP是Model、View、Presenter的缩写。Model代表模型,主要负责加载数据;VIew表示视图,主要负责视图绑定、界面展示、界面逻辑跳转等;Presenter即展示器,主要作为View和Model之间的中间人,完成它们之间的交互,从而实现高内聚低耦合的思想。画出它们之间的关系图。也许这有点抽象,说话很便宜,给你看代码。首先我们看一下我们项目组Android老大的MVP框架实现。封装了各种基类,方便这些新人的开发。(上面的代码也用到了RxJava,emmmm,这其实是我作为一个新人没有接触过的技术,以后会更新RxJava相关的学习博客,努力变强吧~).我们会发现,其实上面三个.javas已经可以实现一个界面的完整逻辑了,但是有了View和Presenter,哪来的Model???合同到底是什么???这还是MVP难道是设计模式???一开始我也是一头雾水,去找boss学了一波。了解到Android的MVP设计模式其实并没有统一的标准。基于MVP思想的实现方式有很多。上图的方法是Google官方提出的一种MVP实现方法。在Google官方的MVP实现中,弱化了Model的作用,将Model集成到了Presenter中。我们可以看到MainPresenter中的getBook方法其实就是Model的实现。至于Contract类,中文翻译就是契约类。合同这个词很形象。它作为view和presenter之间的接口,定义了view和presenter上要实现的方法。然后view和presenter分别实现他们的方法,这样整个界面逻辑就变得相当清晰了。由于老大的代码被封装了,隐藏了一些细节,所以我们来做一个小demo,使用Google官方的MVP实现方法,实现一个模拟从服务端拉取信息到界面的程序,更直观的理解MVP。我们先来看看***呈现的界面。界面布局很简单,就一个TextView和一个Button,布局文件xml就不贴了。主要功能是点击按钮获取数据,模拟从服务器获取数据,然后显示在textview上。下面的代码结构由Activity(也就是View)、Presenter、Contract组成:为了方便讲解代码结构,我们先看一下MainContract中的内容:MainContract的代码很简单,因为Contract是一个契约类,没有实现任何功能,只是指定了Presenter和View分别要实现的接口。我在Presenter接口中定义了LoadData方法,MainPresenter需要实现Presenter接口中的LoadData方法,完成从服务器拉取数据;在接口View中定义了onDataLoaded方法。同样,因为MainActivity应用了接口View,所以需要实现onDataLoaded方法。MainActivity:MainActivity代码MainActivity主要是界面组件的绑定和一些成员变量的初始化。可以看到我这里初始化了textview、button和一个presenter,然后界面上的数据操作都是通过presenter实现的。我们可以看到这里重写了onDataLoaded方法,因为MainActivity在合约类中实现了View接口,所以需要实现接口中的onDataLoaded方法。这个方法的主要作用是将presenter中获取到的数据呈现在界面上,我们这边是将数据展示在界面的textview上。MainPresenter:MainPresenter代码MainPresenter是实现界面数据操作的地方。它实现了合约类的Presenter接口,所以需要实现Presenter接口中定义的LoadData方法。这个方法的作用是从服务器获取数据然后回调到Activity(也就是View),我这里偷懒了,没有服务器获取数据,直接硬编码数据(嘻嘻),嗯,假装从服务器获取数据,然后调用View的onDataLoaded方法将获取到的数据传递给Activity。这样就可以在activity中更新数据了。哦,对了,Presenter中必须有一个View成员变量MainContract.ViewmView;否则,无法调用视图上方的方法。mView的初始化是在Presenter变量创建的时候复制的,在MainActivity中可以看到并运行。Result按钮点击Result这样,我们就实现了一个基于MVP框架的相当简单的应用程序。如果后面需要添加功能,只需在Contract中添加需要的功能的接口,然后分别在Presenter和Activity中实现即可。比如我要添加一个新的函数A,执行后需要在View上做相应的界面变化。我们只需要这样做:1.在Contract中的Presenter中定义functionA方法,在View中定义onFunctionAFinished方法。2.在Presenter实现类中实现functionA的具体方法,调用update接口的onFunctionAFinished。3.在Activity中实现onFunctionAFinished方法。这样一来,又增加了一个功能,是不是很方便,逻辑也很清晰。Activity只需要负责更新界面,数据的获取全部由Presenter实现。具有高内聚、低耦合的特点,对接口的维护和开发很有帮助。当然,以上只是MVP最简单的实现。为了便于理解,我去掉了很多基类的定义和封装。实际开发中不可能这么简单。不过,如果理解了MVP的思路,实现起来还是很清晰的。然后贴上上面代码的github地址。虽然没有几行代码,但是不贴出来太不专业了。公司的开发框架代码我就不贴了,只贴我的简单代码。https://github.com/reggie1996/mvp_demo
