谷歌官方mvp介绍

来源:互联网 发布:干淘宝网店都需要什么 编辑:程序博客网 时间:2024/06/14 13:10

转载请注明出处:
谷歌官方mvp介绍

地址:http://blog.csdn.net/qq_22744433/article/details/78028496

目录

前言


这个wiki是我很早之前看mvp框架时候写的,之前没发到网上,现在也贴上吧。现在来看,这个框架并不适合
大量的业务实用,因为fragment实在是太重了,并不利于页面中业务的模块化。可以看下我的这一篇博客,对这个mvp框架的改进: android 官方mvp框架优化:lifecycle-mvp,像前端那样组合式写页面

不过如果想看官方推荐的mvp框架是什么样的,还是可以看看这篇博客的~

目的:

  • mvp本身的好处。再也不用流水帐式的写代码了,view和presenter可以不同的人去写。view通过fragment来实现,然后添加到activity中。 这样一个activiy可以有多个fragment模块,利于维护和复用。如果每个fragment都进行组件化处理,这样代码维护起来和写起来就容易多了。
  • 我们关心的问题,谁可以复用?view可以替换和复用,presenter也可以替换和复用。activity中不涉及业务代码。

* 感悟:* 需要多练习,细节上先不要考虑太多,都可以后期补充,大框架,大的脉络,锻炼有了想法想到以后就能码,不要怕错。多练习。


官方mvp介绍

总体介绍

  • 一个activty中的业务以fragment分块。activity只是一个展示的舞台。放入每块对应的fragment和其动作。
  • 每一块写的时候,先抽出view和对应的触发动作的接口,便于替换和复用。并且可以由不同的人同时写view和触发动作接口的实现。
  • 每一块block对应的实现类fragment和presenter不会耦合对应动作或者view的接口实现。

官方的mvp和之前一直讨论的mvp稍微有所不同。官网的给出了一个mvp-todo的项目。
我们首先来看下这个项目:

演示

contract介绍

以taskdetail页面为例,我们来实现这个界面。mvp的含义和之前的都是一样的。但是,官方的mvp引入了一个contract。这个contract是一个标准,也就是模版。就是说我之后不管是presenter还是view都是实现contract对应的接口。
该界面contract形式是:
20:35:11.jpg
那我们实现一个界面,应该写哪些接口呢?这是一个问题,通过思考,我认为其中presenter的接口是:这个界面会触发到的一系列动作。比如一个可以下拉刷新的page型的list列表界面,我们思考下会触发到的动作会有哪些呢?首先有启动页面(这个任何页面都会有),还有各种会被出发带来的一系列动作,比如滑动触发带来的加载下一页动作,下拉触发带来的刷新动作。点击每一个item按钮触发带来的跳转下一页动作。那我会想展示这一个列表是不是这个页面的动作呢?不是,因为它并不是一个触发你可以操作的动作。而是一个view本身应该具有的功能。比如我给你一个数据,通过调用view.showlistview(D data)方法,就能展示出来这个列表。通过这样的分析,我们其实就知道view和presenter具体应该有哪些接口就很明确了。通过这个我也清楚了什么是业务逻辑,什么是view本身的逻辑。
现在,我们再返过来看那个页面:
21:07:55.jpg
我们看到这个界面应该有哪些触发逻辑呢?
应该有点击红色的按钮触发的编辑该task动作,右上角点击后的删除该task动作,还有点击task标题前面框框的标记该task动作。其他的应该没有了,我们看下是不是这些呢?答案却是是这样的(标记该task动作分为两个,完成和激活)。
那这个解决了,接下来就是view这个我们都应该写哪些方法。一般的,我们都知道的是showview,hideview这些。具体我认为先不急着写,用到的时候再写就行。记着接口都是一些和view相关的就可以了。

接下来怎么办?实现 presenter接口

当我们写好了contract以后,我们接下来需要实现它。怎么实现。从presenter的那些接口方法入手。首先是起动界面这个触发动作。这个触发动作就是将model的数据展示出来。model的数据从哪里来呢?从model甩出来的接口获取。假如我们使用的model是loader。那我们就在presenter的start()接口中初始化loader。( loader的create()接口不应该在loader中实现,应该这是一个数据请求操作,应该甩出来交给其他来处理,之后再说。)那么我们需要在loadfinish()接口中通过得到的数据调用showtasktitle,showtaskcontent这样的view方法展示出来,还有保存这些数据供其他方法调用(我们在每个方法中注意处理这些变量的状态,其中正是因为有一些成员变量的存在,才使得关联的方法也在一个类中,)。接下来我们可以实现编辑该task这个触发动作。这个简单,将之前加载好的数据包起来,带着跳到下一页就可以了。接下来实现删除task的触发动作。这个需要我们发送一个请求把存储区的数据清除了,销毁该界面,然后跳转到task列表界面。然后是标记该task触发动作。该方法通过发送一个请求把存储区相应的task的标志位修改了,然后通过view的方法展示或隐藏前面的框框,和界面最下面的提示框。
我们看下presenter是不是这样实现的。
presenter中会耦合model,在model甩出来的接口中处理这个block数据的逻辑。

使用fragment去实现view接口

其实这些写下来以后,该实现哪些view接口已经很明显了。然后我们使用fragment去实现这些接口。
在之前我们看到的都是使用一个view来实现这些接口。为什么官网会使用fragment去实现这些view接口呢?因为fragmentyou生命周期。具体来说,就是如果按之前的来进行,那么实现好了view,传入到presenter中生成实例,然后呢?我们需要在activity的某个生命周期中调用presenter实例的getview()和start()方法来加入这个模块和启动这个模块。那如果我们想去掉这个模块了怎么办?我们可能需要在presenter中写一个detaacheview()方法,去掉它。操作略麻烦,这是因为view本身并没有生命周期,所以我们被迫需要在activity中调用presenter进行操作。
而fragment中有生命周期的。做法:
在fragment中实现各个showview,hideview方法外,并设置各种监听器,然后把presenter接口耦合进来,在各监听位置调用此接口的触发动作,包括初始化start()动作。

在activity中的使用

我们在一个activty中想加入一个模块。我们将一个fragment实例添加到对应的framelayout中就可以了。在生成fragment实例时,我们不需要传入presenter。因为fragment中并不包括动作的具体实现,它只是和接口耦合,需要具体动作时再加。所以如果我们想换一个实现了相同接口的fragment,我们直接换就可以了。没有耦合。

然后我们给fragment添加那些触发逻辑动作。我们只需要new 一个 presenter()就可以了。传入需要的loader或者是request 和刚才的那个fragment 然后就没有了,我们在activty中不需要在什么鬼地方调用presenter的某个什么方法,该是不是很神奇!这样我们不需要这个模块的这些触发动作了,我们需要换一个其他版本的触发动作,我们只需要改变这个new的presenter对象就可以了。

为什么这么神奇,因为动作的执行都是在fragment中,但是你可以会问生成fragment时,没有传入presenter啊,因为presenter中生成实例时,传入了fragment,
而传入的fragment实例在presenter中会有一个setpresenter(this),这样就把本身传入进去了,这样就产生了关系。而在activity中我们不用管这些,替换的时候直接替换就可以了。

原创粉丝点击