/MvpForJava

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

Primary LanguageJava

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

感谢

Copyright (C) 2022, appzy