概述
MVPArms是一个整合了大量主流开源项目的Android Mvp快速搭建框架,其中包含Dagger2
Retrofit
,Rxjava
以及Rxbinding
,RxCache
等Rx
系三方库,并且提供UI
自适应方案,本框架将它们结合起来,并全部使用Dagger2
管理并提供给开发者使用,使用本框架开发你的项目就意味着你已经拥有一个MVP+Dagger2+Retrofit+Rxjava项目,发布到github
上可以非常轻松的拿star(在简历中展露头脚),我提供一切迭代和维护成本你只需要在Readme里面注明框架出处,还不赶快行动?
特性
- 自动生成MVP,Dagger2相关类
- 版本更新
- 更新日志
- 常见issues
- 通用框架,适合所有类型的项目,支持大型项目的开发,Demo的包结构直接可以拿来用
- 全部使用
Dagger2
管理(将所有模块使用Dagger
连接起来,绝不是简单的使用) - 大量使用
Rxjava
- 修改包名(common包不要修改)后就可以直接使用,快速接入(老项目接入请按下面的步骤)
- 全部
UI
自适应 - 图片加载类ImageLoader使用策略模式和建造者模式,轻松切换图片加载框架和功能扩展
- Model层提供Retrofit API和RxCache,是否使用缓存自行选择
- 全局
http
Request(请求参数,headers) Response(服务器返回的结果,headers,耗时)信息监听,可解析json后根据状态码做相应的全局操作 - 全局
Rxjava
错误处理,错误后自动重试,捕捉整个应用的所有错误
框架结构
包结构
开发须知
- 开发者需要具有一定的
Android
开发能力 - 开发者必须有使用
Dagger2
,Rxjava
,Retrofit
的经验,没使用过也必须了解,不然很难使用
Libraries简介
Mvp
Google官方出品的Mvp
架构项目,含有多个不同的架构分支(此为Dagger分支).Dagger2
Google根据Square的Dagger1出品的依赖注入框架,通过apt动态生成代码,性能优于用反射技术依赖注入的框架.Rxjava
提供优雅的响应式Api解决异步请求.RxAndroid
为Android提供响应式Api.Rxlifecycle
在Android上使用rxjava都知道的一个坑,就是生命周期的解除订阅,这个框架通过绑定activity和fragment的生命周期完美解决.Rxbinding
JakeWharton大神的View绑定框架,优雅的处理View的响应事件.RxCache
是使用注解为Retrofit加入二级缓存(内存,磁盘)的缓存库Retrofit
Square出品的网络请求库,极大的减少了http请求的代码和步骤.Okhttp
同样Square出品,不多介绍,做Android都应该知道.Autolayout
鸿洋大神的Android全尺寸适配框架.Gson
Google官方的Json Convert框架.Butterknife
JakeWharton大神出品的view注入框架.Androideventbus
一个轻量级使用注解的Eventbus.Timber
JakeWharton大神出品Log框架,内部代码极少,但是思想非常不错.Glide
此库为本框架默认封装图片加载库,可参照着例子更改为其他的库,Api和Picasso
差不多,缓存机制比Picasso
复杂,速度快,适合处理大型图片流,支持gfit,Fresco
太大了!,在5.0一下优势很大,5.0以上系统默认使用的内存管理和Fresco
类似.Realm
速度和跨平台性使它成为如今最火的数据库,美中不足的就是so库太大LeakCanary
Square出品的专门用来检测Android
和Java
的内存泄漏,通过通知栏提示内存泄漏信息RxErroHandler
Rxjava
错误处理库,可在出现错误后重试
1 开发准备
此框架适合自己做定制修改,所有暂时不上传至
Jcenter
或Maven
,请自行下载或clone
1.1 导入框架
compile project(':arms')
1.2 引用config.build
本框架提供一个引用大量第三方库的config.gradle文件,用于第三方库版本管理,将config.gradle复制进根目录,并在项目的顶级build.gradle中引用它
// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: "config.gradle" //这里表示引用config.gradle文件
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }//这里要使用rxcahche指定的仓库
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
1.2.1 使用config.build
因为在顶级build.gradle中引用了它,所以在整个项目的所有build.gradle中都可以使用rootProject.xxx来使用它里面的内容
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile rootProject.ext.dependencies["junit"]
compile rootProject.ext.dependencies["support-v4"]
compile rootProject.ext.dependencies["gson"]
compile rootProject.ext.dependencies["appcompat-v7"]
compile rootProject.ext.dependencies["cardview-v7"]
compile rootProject.ext.dependencies["autolayout"]
compile rootProject.ext.dependencies["butterknife"]
compile rootProject.ext.dependencies["androideventbus"]
}
也可以使用它来管理一些项目的信息,这样有多个module也可以直接使用一个信息
android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
buildToolsVersion rootProject.ext.android["buildToolsVersion"]
useLibrary 'org.apache.http.legacy'
defaultConfig {
minSdkVersion rootProject.ext.android["minSdkVersion"]
targetSdkVersion rootProject.ext.android["targetSdkVersion"]
versionCode rootProject.ext.android["versionCode"]
versionName rootProject.ext.android["versionName"]
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
1.3 依赖Dagger2
本框架全部使用Dagger2管理,所以必须依赖Dagger2,找到app的build.gradle,加入如下代码
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'//使用apt插件
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'//使用apt
}
}
dependencies {
apt rootProject.ext.dependencies["dagger2-apt-compiler"]//依赖apt插件
provided rootProject.ext.dependencies["javax.annotation"]//dagger2必须依赖jsr250 annotation
}
1.4 配置AndroidManifest
1.4.1 添加权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>