使用Java构建的一个模块化的MVP的项目
个人项目仅供学习使用,感谢以下开放Api:
Demo简介
该 Demo 更加详细的封装思路,请点击文章如何既装逼又优雅的设计一个模块化的MVP架构
提供给初中级开发者学习模块化的项目结构搭建
帮助开发者快速开发,demo很多地方可以灵活配置,可直接clone本项目到本地进行项目创建
本Java版本项目也同时依赖了Kotlin,并仅在view层(Activity/Fragment)内使用了Kotlin编写,方便开发者后期混合编程或者转向Kotlin开发,为此我还同时写了一个纯Kotlin版本的Demo,感兴趣的朋友可以点击看看
希望路过的各位开发好汉,觉得不错的帮忙点个Star,谢谢~~
功能预览:
主要开源框架:
特点功能
项目架构使用了符合绝大部分项目使用的 MVP 架构模式,并使用模块化设计方便多人维护
使用了目前最流行的 RxJava2+Retrofit2+Okhttp3 作为网络框架搭建
支持多BaseUrl(多服务器地址)访问接口,开发者可自行扩展
同时支持表单提交、raw提交,并自动解析提交数据和返还数据
支持 header 的动态添加
支持对前后端约定的业务码进行统一形式(逻辑处理、通知view)处理,如 code=311,则是对Token过期处理等
支持请求(请求参数、header)、响应信息(响应状态、响应的json数据)的打印
支持自定义网络请求异常信息
支持 https 证书的自定义配置
使用比 RxLifecycle 库更加优秀的 AutoDispose 库作为解决在 View 生命周期的变化中造成的内存泄漏问题
使用 Arouter 库作为项目路由,作为模块之间的通信桥梁
使用 腾讯X5内核浏览器 替代原生WebView加载网页
项目中封装了一个带状态的 RecyclerView,如错误页面、空页面状态展示,开发者可以根据项目情况自行扩展使用
基础MVP项目架构图
网络框架UML图
lib依赖关系
快速集成到新项目中使用
1.clone到本地后,复制config.gradle文件,然后在项目build.gradle中引入config.gradle
apply from: "config.gradle"
2.复制 common 模块并添加到项目中,然后业务模块依赖common模块
3.创建View层Activity继承BaseActivity,同时绑定Presenter
4.创建Contact接口类,约定View层接口和Presenter层接口
5.创建Presenter实现类,在Presenter实现类里面处理逻辑,通过传递进来的View实例通知View层
调用示例
1.普通 Get 请求提交示例:
WanAndroidFormRequestClient.getInstance().executeGet(UrlConstant.GET_BANNER_JSON, null, new AppObserver(view,true) {
@Override
public void onNext(BannerResult bannBannerResulterResults) {
super.onNext(bannBannerResulterResults);
view.onBanner(bannerResults.getData());
}
});
2.普通 Post 请求提交示例:
HashMap params = new HashMap<>();
params.put("id",id+"");
params.put("udid","d2807c895f0348a180148c9dfa6f2feeac0781b5");
BaobabFormRequestClient.getInstance().executePost(UrlConstant.POST_CATEGORIES_VIDEO_LIST, params, new AppObserver(view) {
@Override
public void onNext(VideoListResult videoListResult) {
super.onNext(videoListResult);
view.setVideoList(videoListResult.getItemList());
}
});
3.带 Header 的 Get 请求提交示例(Post 类似):
HashMap headers = new HashMap<>();
headers.put("token","hosdbdkasdnfdfl");
WanAndroidFormRequestClient.getInstance().executeGetWithHeader(headers,UrlConstant.GET_BANNER_JSON, null, new AppObserver(view,true) {
@Override
public void onNext(BannerResult bannerResults) {
super.onNext(bannerResults);
view.onBanner(bannerResults.getData());
}
});
4.若请求不需要绑定 AutoDispose 来干预订阅者的调用的时候,可如下方式使用(传入 AppObserver 的构造函数控制):
WanAndroidFormRequestClient.getInstance().executeGet(UrlConstant.GET_BANNER_JSON, null, new AppObserver(view,false) {
@Override
public void onNext(BannerResult bannerResults) {
super.onNext(bannerResults);
view.onBanner(bannerResults.getData());
}
});
一些问题
1.ARoter报错
先检查一下所有模块是否都在build.gradle文件中添加了
apply plugin: 'kotlin-kapt'
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
若项目未使用Kotlin则以上代码换做
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
检查如果以上问题不存在的话,再检查是否每个模块都直接依赖了arouter-compiler,必须是直接依赖。
依赖代码如下:
java版本
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
kotlin版本
kapt 'com.alibaba:arouter-compiler:x.x.x'
感谢