
Android MVP框架搭建与使用(含源码)
选择Android Library前言
其实之前我是写过相关的MVP文章的,只不过当时在是天气APP中,而这里是单独拉出来讲,因此会有一些不同。
正文
先在Android Studio中创建一个名为MvpDemo的项目。创建好如下图所示
一、创建mvp模块
再创建一个依赖模块,File → New → New Module…选择Android Library
Next,修改一下模块名字
点击Finish,你的mvplibrary模块就创建完成了。
下面在app模块中依赖mvplibrary模块。在AS的右上角工具栏中找到上图中的图标按钮,点击进入如下页面。
然后通过上面的操作,到最后一步点击这个Module Dependency会出现如下页面勾选上,点击OK。
你会发现这里多了一个依赖,然后点击OK即可。现在已经依赖好了,下面就是MVP框架的搭建了,搭建过程中都是在mvplibrary中,与app模块无关。
二、搭建MVP框架
1. 创建Activity管理
首先在com.llw.mvplibrary下新建一个ActivityManager类,里面的代码如下:
2. 创建基类Application
在com.llw.mvplibrary下新建一个BaseApplication类,里面的代码如下:
3. 创建base包(以及包下的类和接口)
在com.llw.mvplibrary下新建一个base包,然后在这个包下面新建一个IUiCallback接口,里面代码如下:
之后再新建一个BaseView接口,这是一个空接口。
然后创建一个BasePresenter,在这里可以操作View,这是MVP中的核心思想,通过P层控制M和V,从而减低M和V的耦合,甚至让它们不存在直接关联。
下面写BaseActivity,一般的Activity只要继承这个BaseActivity,重写里面的方法即可。
一般来说这样就可以了,但是以我的开发习惯来说我还会加上这个页面加载的弹窗和页面销毁的控制,那么下午我给加上。
首先需要在drawable下添加两个图片,这两个图片有一些特殊,建议你直接在我的源码里面复制出来,因为我现在贴出来你拿过去直接用是达不到实际的效果的。
然后com.llw.mvplibrary下新建一个view包,然后新建一个LoadingView类,里面的代码如下:
再新建一个LoadingTextView,里面的代码如下:
然后在res下新建一个layout文件夹,在这个文件夹下新建一个dialog_loading.xml,里面的布局代码如下:
还需要在valuse下新建一个styles.xml,里面的代码如下:
然后在BaseActivity中新增如下两个方法。
然后再增加页面返回的处理。
这一步为止,这个BaseActivity就写完了,下面该写BaseFragment了。
现在这个base包下的内容就写完了,该到mvp包了。
4. 创建mvp包(以及包下的Activity和Fragment)
在com.llw.mvplibrary下创建一个mvp包,在这个包下创建一个MvpActivity抽象类,代码如下:
然后创建一个MvpFragment抽象类
它里面的代码其实和MvpActivity差不多,唯一区别就是继承的父类不同。
mvp包中的代码就写完了,下面就到网络请求的使用了,这里我会采用我之前写的一个网络访问框架,把它融合到这个Mvp框架中,成为一体,如果你还没有了解过网络访问框架的话,不妨看看这一篇文章Android OkHttp+Retrofit+RxJava搭建网络访问框架,相信对你有所帮助,那么为了避免一些麻烦我直接去Github上面把源码下载下来。
5. 结合网络访问框架
进入源码地址:NetworkFrameWorkDemo
下载到本地,然后解压。
然后打开到最下面的network包
将这个文件夹复制到com.llw.mvplibrary下。如下图所示
然后找到res下这四个文件夹,全部复制粘贴到你项目的res下
然后修改一下network包下一些类的包异常问题,建议你把这个里面的每一个类或者接口都打开一次,报红的就是里面的包路径需要修改的。
然后可以在app模块中使用了,使用过程可能一开始有一些麻烦,但是当你熟悉之后就好了。
三、使用MVP框架
通过上面的一系列搭建MVP框架依赖模块的过程,目前就已经完成了,那么接下来就到了使用阶段,既然是使用那么自然而然就是在app模块中了,当前这个模块中只有一个MainActivity。
1. 创建application包以及下面的类
在com.llw.mvpdemo下新建一个application包,在这个包下创建一个NetworkRequiredInfo类,里面实现network包下的INetworkRequiredInfo接口,目的就是获取APP运行时的一些信息,里面的代码如下:
然后同样在这个application包下新建一个MyApplication类
这里面主要完成对网络的初始化,在这个init方法中,完成了对环境的配置
你如果你对这一块并不了解,你可以先看看Android OkHttp+Retrofit+RxJava搭建网络访问框架这篇文章,相信你就明白了,因为内容实在比较多,因此写到一起你可能不太有耐心看完。
刚才写了MyApplication,自然要在AndroidManifest.xml中配置才行,如果你不配置则就是使用系统的Application
这样就配置好了
2. 创建ApiService接口
最好有一个地方可以集中写一些接口,因为在实际开发中,一个服务器中不可能就一个接口,因此前面的地址和后面的参数是可以分开的。
下面在com.llw.mvpdemo下新建一个api包,这个包下新建一个ApiService接口
现在你的这个GankResponse肯定是报红的,因为没有所以需要创建一个,这个实体Bean的意思就是当你请求网络接口,会将返回的数据解析成这样的一个实体,而Observable则是用来出来OkHttp的返回数据的。如果你使用Retrofit来处理返回这里就要改成Call,这种方式你可以参考我在天气APP中的网络写法看看。
下面创建一个这样返回数据类。这里最好的方式是在com.llw.mvpdemo下再建一个bean包或者model包,看个人习惯了,我个人习惯建bean包,然后包下新建一个GankResponse类,类的代码如下:
下面就该到主角登场了,那就是一个可以把M、V、P结合起来使用的东西。
3. 创建订阅合同
在com.llw.mvpdemo下新建一个contract包,这个包下新建一个MainContract类,里面的代码如下:
请仔细的看看这些代码,你就明白这个类做了什么。
4. 数据渲染
下面要显示数据了,不过这个数据是要显示在列表上的,如果有列表,自然要有适配器了,适配器是需要绑定控件的,那么首先创建一个列表的item布局。
在layout下新建一个item_list.xml,里面的代码如下:
然后写适配器,在com.llw.mvpdemo下新建一个adapter包。在这个包下新建一个GankListAdapter类,里面的代码如下:
里面的代码还是比较简单了,当然前提是你熟悉BaseQuickAdapter,个人觉得比Android自带适配器要好用很多。
适配器和item的布局都写好了,下面修改一下activity_main.xml的布局
下面终于到MainActivity了,先继承MvpActivity,传入P,然后实现MainContract.IMainView,可以删掉原来onCreate方法了。
下面先创建一些成员变量
初始化列表
网络请求的正常和异常返回
最后在initData中调用初始化方法即可,下面运行一下:
四、源码
源码地址:MvpDemo
尾声
不知道你现在了解MVP这个模式没有,当然我写博客从来都是注重实操的,你讲一大堆理论放在那里没有实际的项目或者搭建过程,别人是不容易上手的,希望看这篇文章的朋友能够,把里面的每一行代码都敲一遍,这样你的理解就更深。
