萌新入手MVP框架容易迷茫的地方

本人也是萌新一枚,最近接手公司一个项目,发现用的mvp框架,而自己也是才接触mvp框架没有多久,概念也比较模糊,然后使用最直接的方法,百度,看了很多关于mvp的博客,稍微解决了一点心中的迷茫。在这里作为记载,也同时分享自己的理解。
相信很多萌新都一样,准备学习mvp框架的时候,肯定是百度看博客啊,找视频学习啊。我也一样,然后发现一个很纠结的问题:大家的mvp框架怎么都不一样?不知道大家有没有这种感觉。先对这个问题入手:
mvp框架主要model,view和presenter层,这些都是没有疑问的,presenter作为一个中介存在。也是没有什么问题的,但是对于接口的定义像IVew,IModel,IPresenter,基于接口的base,还有就是Contract,这几个定义是不同博客区别最大的,有一些博主根据自己的理解对view层的作用进行了弱化,认为直接在activity或者fragment中进行UI操作就行了。把耗时操作交给presenter,缓存数据操作交给model,有一个博主则弱化了model层的作用。然后对于协议类Contract,有一些使用了,有一些根本不需要使用。导致在研究mvp时产生了很多困惑。
看了很多大佬写的之后,我是这么总结的,实际上mvp是一种思想。他提供一种大致的思路,但并不是说精确到每一个类要怎么定义,对于接口类和基类也一样,可能是最早一批研究使用这个mvp架构时发现代码冗余,然后就使用了接口类和基类。当然,大佬肯定写代码肯定是会先把基类和接口类全部定义好,我想表达的意思是,基类,接口类,contract实际上不能代表mvp核心。只是一些辅助而已。但是有一些共同点,比如像presenter层绑定和解绑view这样的操作一般在基类中进行。
所以说其实不用纠结为啥大家的都不样,其实思想都是一样的,对此谷歌也提供了他们认为的mvp框架标准,在github 上可以去查看,引用下载。(这个大家应该都清楚的)
mvp的核心思想呢,肯定在于p上。也就是presenter,所以我们需要了解的就是他的优势,然后在我们的项目中如何利用好这个优势。不用太纠结于谁写的才是最正规的。其实大家都有自己的想法和思路,用的好用才是最关键的。
下面介绍一下自己的用法。
在网上看过几篇mvp文章都清楚,mvp框架共有的特征就是类多。类太多了,手写起来确实不易。所以这里使用mvp插件,插件名字为MvpAutoCodePlus,用于自动生成mvp相关类。这里附上链接
https://www.wanandroid.com/blog/show/2221
好,如果没有使用过这个插件的话可以去下载使用很方便。下好之后记得重启studio。
如果还不太熟悉mvp框架,对于配置插件肯定是懵的。怎么要配置这么多类,wfk??他们都是些什么鬼。这里稍微给大家讲解一下。其实就是基类和接口类。
在这里插入图片描述
我的基本配置是这样的,接口的作用在于对于框架一定需要写的方法,加入到接口中,例如:
在这里插入图片描述
这是一个presenter接口,他一定是需要获取和解除view的,在接口中就有这些个方法,用基类去实现接口重写这些方法来实现。
在这里插入图片描述
view层绑定presenter的操作。在接口中定义。实际上泛型就代表的是一种持有。v持有p,而p作为中介肯定是要持有v和m 的。
所以其实在配置中最关键的是泛型怎么配置,类名都是自己可以按照自己喜好取的。
现在主要说一下具体的使用方式。
然后我们根据那个方法创建类的时候,会生成4个包,分别是view,model,presenter和contract。
在这里插入图片描述
这四个类的使用,可能每个人还是会不一样,这里我感觉自己对于这个使用稍微弱化了model层的使用。接下来举实例吧,先举一个老生常谈的登录实例。我们希望view直接调用一个login(phone,pwd);然后直接返回结果再做返回后的ui操作。例如这样(结合retrofit+rxjava,这两个框架现在非常流行,建议去学习一下,本人也是刚接触不久,不太熟悉,勉强介绍,理解一下):
在这里插入图片描述
checkEmpty跟本文内容无关请忽略,如果账号密码不为空会执行框起来的方法,非常简单就直接通过getPresenter获取到presenter后,直接调用presenter的方法login 完成网络请求操作之后调用有两个返回方法一个是返回成功的,一个是失败的。失败返回的是throwable转化成错误message信息,成功后result直接就是返回json转换成的类。就真的是简单利落了。(用到java8新特性lambda表达式,如果没看过的话可以百度一下,应该都用过吧)
接下来看presenter是怎么实现的。
在这里插入图片描述
这里只关注login方法。利用retrofit进行网络请求。返回一个发射器,泛型就是json数据对应的类。可以看的到耗时操作也是写在这里的。
getModel().clearAccount();是对model 层的使用,doOnNext方法是在请求网络之前的操作。调用model层方法先保存一次数据。
在这里插入图片描述
不要误会,这个model层的login只是保存数据而已,没有登录操作。
这样一来登录完成了。而contract 的使用呢,是一个协议,里面用来写接口,也就是三个层需要去实现的方法。
在这里插入图片描述
需要使用到什么方法,现在协议类中将参数和返回值的方法定义好。
view层的使用其实跟model 层的类似,反正就是以presenter为核心,比如你在presenter中请求网络,请求完之后调用view 接口的方法传入参数,例如updateUI(result);
然后在activity中重写方法。
@Override
public void updateUI(result){
textview.setText(result.getName());
};
大概就是这样。
本文使用的代码都是实际项目中的,有些地方可能涉及到一些其他的操作,所以就以截图的方式给大家呈现,理解上可能会比较费劲,但是对于实际工作是很有帮助的,如果仅仅只是演示mvp写了几个类,连基类和base都可以不要,虽然实现了mvp模式,代码在工作中也是没有任何作用的。所以本文主要是想把思想分享给大家,如何在真正工作代码中去实现mvp。简单来说。就是以presenter为核心,因为真正耗时的操作都写在presenter中,前后保存数据或者是更新ui操作,在presenter中执行接口方法。然后在activity或者fragment中去实现,这样就可以非常明确的分工了。
在写博客之前可能还有一些想法,写的时候忘记了,以前读书有时候会写日记,也是这样,想到的东西要写的时候又忘了。所以有遗漏不清楚而地方可以随时联系我,always online,非常乐意大家相互学习,共同进步!!!
对于文中的retrofit和rxjava,其实不难,只是有很多新的方法,陌生的东西。了解了勉强用用也是可以的,以后再分享吧。
希望对大家有所帮助,谢谢大家吧!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值