MvpForJava
MvpForJava copied to clipboard
一个可直接快速引入的 Java 版本的模块化 MVP 框架
使用Java构建的一个模块化的MVP的项目
个人项目仅供学习使用,感谢以下开放Api:
Demo简介
- 该 Demo 更加详细的封装思路,请点击文章如何既装逼又优雅的设计一个模块化的MVP架构
- 提供给初中级开发者学习模块化的项目结构搭建
- 帮助开发者快速开发,demo很多地方可以灵活配置,可直接clone本项目到本地进行项目创建
- 本Java版本项目也同时依赖了Kotlin,并仅在view层(Activity/Fragment)内使用了Kotlin编写,方便开发者后期混合编程或者转向Kotlin开发,为此我还同时写了一个纯Kotlin版本的Demo,感兴趣的朋友可以点击看看
- 希望路过的各位开发好汉,觉得不错的帮忙点个Star,谢谢~~
功能预览:
主要开源框架:
- Rxjava2
- Rxandroid2
- Retrofit2
- Okhttp3
- Gson
- Logger
- AutoDispose
- Glide
- Arouter
- Eventbus
- GreenDao
- Andpermission
- X5webview
- FlycoTabLayout
- Banner
- SmartRefreshLayout
特点功能
- 项目架构使用了符合绝大部分项目使用的 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<BannerResult>(view,true) {
@Override
public void onNext(BannerResult bannBannerResulterResults) {
super.onNext(bannBannerResulterResults);
view.onBanner(bannerResults.getData());
}
});
2.普通 Post 请求提交示例:
HashMap<String,Object> params = new HashMap<>();
params.put("id",id+"");
params.put("udid","d2807c895f0348a180148c9dfa6f2feeac0781b5");
BaobabFormRequestClient.getInstance().executePost(UrlConstant.POST_CATEGORIES_VIDEO_LIST, params, new AppObserver<VideoListResult>(view) {
@Override
public void onNext(VideoListResult videoListResult) {
super.onNext(videoListResult);
view.setVideoList(videoListResult.getItemList());
}
});
3.带 Header 的 Get 请求提交示例(Post 类似):
HashMap<String,String> headers = new HashMap<>();
headers.put("token","hosdbdkasdnfdfl");
WanAndroidFormRequestClient.getInstance().executeGetWithHeader(headers,UrlConstant.GET_BANNER_JSON, null, new AppObserver<BannerResult>(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<BannerResult>(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'
若检查还是没有问题却还报错,建议点击此链接滑动网页到后面查看官方Q&A