今年的Android技术圈中MVP,Dagger2,Rxjava,Retrofit这些词汇非常火,随便打开一个技术论坛都充斥着大量的关于这些技术的文章,Github也充斥着各种以基于MVP+Retrofit+RxJava+Dagger2+MaterialDesign开发的开源项目或Demo.
但是大家这么热心的开源此类项目,一直重复的做着同样的事教授大家使用的方式和技巧有没有想过依赖一个第三方库,就可以快速的搭建此类框架?
What is MVPArms?
MVPArms是一个集成了大量Android主流框架,并且全部使用Dagger2管理,以及提供API将所有库连接起来方便使用,还提供详细的WiKi文档.
它可以使开发后面的所有项目都不用重复的复制粘贴(用过此类框架的朋友应该知道,这些库都依赖其它的库,就算一个build.gradle都会浪费很多时间),一个依赖省去很多烦恼,而且对于新手来说这些框架难的不仅仅是API的使用,更难的是怎么把它们结合到一起,应对各种场景的使用.
对于一个新的Android项目,特别是熟练使用Dagger2和Rxjava的开发者,你们只需要将此项目Clone下来,Demo只实现了一个页面,将此页面删除掉,添加所需要的Retrofit API,你的框架就搭建好了,你就可以直接使用Demo进行后续的开发,包结构也适合后面的扩展.
Notice
一键生成 MVP , Dagger2 相关类(开发神器,不看后悔!) 点击打开链接
MVPArms 学习项目 点击打开链接
更新日志 点击打开链接
常见 Issues 点击打开链接
一行代码监听 App 中所有网络链接的上传以及下载进度,以及 Glide 加载进度 点击打开链接
以最简洁的 Api 让 Retrofit 同时支持多个 BaseUrl 以及动态改变 BaseUrl 点击打开链接
Feature
通用框架,适合所有类型的项目,支持大型项目的开发,兼容组件化开发,可作为组件化的 Base 库
框架高度可自定义化,可在不修改框架源码的情况下对 Retoift , Okhttp , RxCache , Gson 等框架的特有属性进行自定义化配置,可在不修改框架源码的情况下向 BaseApplication , BaseActivity , BaseFragment 的对应生命周期中插入代码
独创的 RxLifeCycle 应用方式, 可在不继承 RxLifeCycle 提供的 Activity 和 Fragment 的情况下, 正常使用 RxLifeCycle 的所有功能, 且使用方式不变
全局使用 Dagger2 管理,独创的建造者模式 Module ,可实现使用 Dagger2 向框架任意位置注入自定义参数(将所有模块使用
Dagger2 连接起来,绝不是简单的使用)
全局监听整个 App 所有 Activity 以及 Fragment 的生命周期(包括三方库),并可向其生命周期内插入代码
全局监听 Http Request(请求参数, Headers ...), Response (服务器返回的结果, Headers ,耗时 ...)等信息(包括 Glide 的请求),可解析 json 后根据状态码做相应的全局操作以及数据加密, Cookie 管理等操作
全局管理所有 Activity (包括三方库的 Activity),可实现在整个 App 任意位置,退出所有 Activity ,以及拿到前台 Activity 做相应的操作(如你可以在 App 任何位置做弹出 Dialog 的操作)
全局 Rxjava 错误处理,错误后自动重试,捕捉整个应用的所有错误
全局 UI 自适应
图片加载类 ImageLoader 使用策略模式和建造者模式,轻松切换图片加载框架,方便功能扩展
修改包名后就可以直接使用,快速接入(老项目接入请按下面的步骤)
Where?
MVPArms欢迎Star和Fork
Architectural
Package Structure
Wiki
详细用法请参照Wiki,下面只是简单的介绍下MVP
Contract
根据Google官方的MVP项目,可以在Contract中定义MVP的接口,便于管理,此框架使用Dagger注入Presenter无需定义Presenter接口,所以Contract只定义Model和View的接口
public interface UserContract {
//对于经常使用的关于UI的方法可以定义到BaseView中,如显示隐藏进度条,和显示文字消息
interface View extends BaseView {
void setAdapter(DefaultAdapter adapter);
void startLoadMore();
void endLoadMore();
}
//Model层定义接口,外部只需关心model返回的数据,无需关心内部细节,及是否使用缓存
interface Model {
Observable> getUsers(int lastIdQueried, boolean update);
}
}
View
一般让Activity或Fragment实现Contract中定义的View接口,供Presenter调用对应方法操作UI,BaseActivity默认注入Presenter,如想使用Presenter,必须指定Presenter的范型,和实现setupActivityComponent来提供Presenter需要的Component和Module
public class UserActivity extends WEActivity implements UserContract.View {
@Override
protected void setupActivityComponent(AppComponent appComponent) {
DaggerUserComponent
.builder()
.appComponent(appComponent)
.userModule(new UserModule(this))
.build()
.inject(this);
}
@Override
protected View initView() {
return LayoutInflater.from(this).inflate(R.layout.activity_user, null, false);
}
@Override
protected void initData() {
}
}
Model
Model实现Contract的Model接口,并且继承BaseModel,指定范型为ServiceManager和CacheManager,然后通过两个Manager拿到需要的Service和Cache为Presenter提供需要的数据(是否使用缓存请自行选择,Presenter无需关心细节)
public class UserModel extends BaseModel implements UserContract.Model{
private CommonService mCommonService;
private CommonCache mCommonCache;
public UserModel(ServiceManager serviceManager, CacheManager cacheManager) {
super(serviceManager, cacheManager);
this.mCommonService = mServiceManager.getCommonService();
this.mCommonCache = mCacheManager.getCommonCache();
}
@Override
public Observable> getUsers(int lastIdQueried, boolean update) {
}
}
Presenter
Presenter在MVP中的大部分的作用为通过从Model层接口获取数据,在调用View层接口显示数据,首先实现BasePresenter,指定Model和View的范型,注意一定要指定Contract中定义的接口,Presenter需要的Model和View,都使用Dagger2注入,这样即解藕又方便测试,怎么注入?
@ActivityScope
public class UserPresenter extends BasePresenter {
@Inject
public UserPresenter(UserContract.Model model, UserContract.View rootView) {
super(model, rootView);
}
//这里定义业务方法,相应用户的交互
public void requestUsers(final boolean pullToRefresh) {
}
}
Acknowledgement
感谢本框架所使用到的所有三方库的Author,以及所有为Open Sourece做无私贡献的Developer和Organizations,使我们能更好的工作和学习,本人也会将业余时间回报给开源社区
1.MvpGoogle官方出品的Mvp架构项目,含有多个不同的架构分支(此为Dagger分支).
2.Dagger2Google根据Square的Dagger1出品的依赖注入框架,通过Apt编译时生成代码,性能优于使用运行时反射技术的依赖注入框架.
3.Rxjava提供优雅的响应式Api解决异步请求以及事件处理.
4.RxAndroid为Android提供响应式Api.
5.Rxlifecycle在Android上使用rxjava都知道的一个坑,就是生命周期的解除订阅,这个框架通过绑定activity和fragment的生命周期完美解决.
6.RxCache是使用注解为Retrofit加入二级缓存(内存,磁盘)的缓存库.
7.RxErroHandler 是 Rxjava 的错误处理库,可在出现错误后重试.
8.RxPermissions用于处理Android运行时权限的响应式库.
9.RetrofitSquare出品的网络请求库,极大的减少了http请求的代码和步骤.
10.Okhttp同样Square出品,不多介绍,做Android都应该知道.
11.Autolayout鸿洋大神的Android全尺寸适配框架.
12.GsonGoogle官方的Json Convert框架.
13.ButterknifeJakeWharton大神出品的view注入框架.
14.Androideventbus一个轻量级使用注解的Eventbus.
15.TimberJakeWharton大神出品Log框架容器,内部代码极少,但是思想非常不错.
16.Glide此库为本框架默认封装图片加载库,可参照着例子更改为其他的库,Api和Picasso差不多,缓存机制比Picasso复杂,速度快,适合处理大型图片流,支持gfit,Fresco太大了!,在5.0以下优势很大,5.0以上系统默认使用的内存管理和Fresco类似.
17.LeakCanarySquare出品的专门用来检测Android和Java的内存泄漏,通过通知栏提示内存泄漏信息.
希望大家喜欢
觉得不错的话,记得打赏一下:
https://blog.csdn.net/shenggaofei/article/details/105873568