Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

AnthonyCoder/MvpForJava

Repository files navigation

使用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<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

感谢

About

一个可直接快速引入的 Java 版本的模块化 MVP 框架

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

AltStyle によって変換されたページ (->オリジナル) /