最近准备抽时间学习一下MVP模式的使用,尝试一些新的东西,在google查了一圈,最终选定了几篇比较好的文章,做了下从MVC到MVP的实践,以下是一些心得与总结。
MVC
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。
参考博客
简单根据MVC原则实现了一个demo,主要功能是输入手机号码,通过网络查询归属地。界面如下:
主要技术及排坑:
(1)使用Retrofit2.0 + OkHttp + fastjson实现网络通信
(2)由于Retrofit不支持fastjson,需要自己去写一个fastjson Converter,主要实现三个类(Powered by JinSen):
然后需要设置一下retrofit的converter即可。
(3)整个MVC框架还是比较简单的,因为Activity既是Controller又是View,所以主要的工作在于Model。
在写Retrofit网络框架的时候主要遇到的问题在于Url的定义,之前在其他文章里也看过关于Url的写法问题,但是没有注意,所以就被坑了好长时间。。。
是的,Retrofit2.0使用了新的URL定义方式,有三种写法,之前看到过的时候还在想居然这么奇葩,然后写的时候就犯了错误,一直使用第三种的写法,导致始终报303 Found的重定向错误。
推荐:使用第二种写法,不容易出错。
(4)在排查上面错误的时候,也拓展了两个知识点:
1. Log Request And Response
在Retrofit2.0里取消了Log的功能,据说是因为之前的Log功能不够可靠,所以去掉了,等之后有稳定版本了再加上。
但是OkHttp是具有Log功能的,具体做法如下:
Retrofit使用说明
推荐一下这个网站,上面有很详细的Retrofit2.0的时候方法,同时推荐一下他们的电子书,虽然有点贵,但是会不断更新,这一点还是非常良心的。
2. 使用Charles进行手机数据包抓取
通过打印Log没有排查出来错误,然后就通过抓包软件获取手机全部网络信息,操作也比较简单,设置一下代理,手机所有的网络通信就全部可以显示出来了。
(5)MVC模式是一种比较常规的Android编程模式,但是很多时候Activity/Fragment既负责页面显示(View)的工作,又负责逻辑控制(Controller)的工作,当页面比较复杂,整个Activity/Fragment文件会非常大,之前的项目里很多文件都超过了1000行,但很多东西又不容易分出去,这也是我之前一直很烦恼和困惑的地方。
Github地址:https://github.com/zhangke445566/AndroidDesignPatternTest
之后我会不断完善这个项目,探索几种MVP模式的写法及优缺点。