MVPArms MVP+Dagger+Retrofit+Rxjava快速集成框架
原文地址: http://www.jianshu.com/p/48e66e879061
前言
-
今年的Android技术圈中
MVP
,Dagger2
,Rxjava
,Retrofit
这些词汇非常火,随便打开一个技术论坛都充斥着大量的关于这些技术的文章,Github
也充斥着各种以基于MVP+Retrofit+RxJava+Dagger2+MaterialDesign开发的xxxx
为标题的开源项目或Demo. -
但是大家这么热心的开源此类项目,一直重复的做着同样的事
教授大家使用的方式和技巧
有没有想过依赖一个第三方库,就可以快速的搭建此类框架?
What is MVPArms?
-
MVPArms
是一个集成了大量Android主流框架,并且全部使用Dagger2管理,以及提供API将所有库连接起来方便使用,还提供详细的Wiki文档. -
它可以使开发后面的所有项目都不用重复的复制粘贴(用过此类框架的朋友应该知道,这些库都依赖其它的库,就算一个build.gradle都会浪费很多时间),一个依赖省去很多烦恼,而且对于新手来说这些框架难的不仅仅是API的使用,更难的是怎么把它们结合到一起,应对各种场景的使用.
-
对于一个新的Android项目,特别是熟练使用Dagger2和Rxjava的开发者,你们只需要将此项目Clone下来,Demo只实现了一个页面,将此页面删除掉,添加所需要的RetrofitAPI,你的框架就搭建好了,你就可以直接使用Demo进行后续的开发,包结构也适合后面的扩展.
Notice
Feature
-
通用框架,适合所有类型的项目,支持大型项目的开发,兼容组件化开发,可作为组件化的 Base 库
-
框架高度可自定义化,可在不修改框架源码的情况下对 Retoift , Okhttp , RxCache , Gson 等框架的特有属性进行自定义化配置,可在不修改框架源码的情况下向 BaseApplication , BaseActivity , BaseFragment 的对应生命周期中插入代码
-
全局使用 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?
Architectural
Package Structure
How?
Wiki
Contract
根据
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<List<User>> 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<UserPresenter> 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<ServiceManager,CacheManager> 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<List<User>> getUsers(int lastIdQueried, boolean update) {
}
}
Presenter
Presenter在MVP中的大部分的作用为通过从Model层接口获取数据,在调用View层接口显示数据,首先实现BasePresenter,指定Model和View的范型,注意一定要指定Contract中定义的接口,Presenter需要的Model和View,都使用Dagger2注入,这样即解藕又方便测试,怎么注入?
@ActivityScopepublic class UserPresenter extends BasePresenter<UserContract.Model, UserContract.View> { @Inject
public UserPresenter(UserContract.Model model, UserContract.View rootView) { super(model, rootView);
} //这里定义业务方法,相应用户的交互
public void requestUsers(final boolean pullToRefresh) {
}
}
Acknowledgement
感谢本框架所使用到的所有三方库的Author,以及所有为
Open Sourece
做无私贡献的Developer和Organizations,使我们能更好的工作和学习,本人也会将业余时间回报给开源社区
-
Dagger2
Google根据Square的Dagger1出品的依赖注入框架,通过Apt编译时生成代码,性能优于使用运行时反射技术的依赖注入框架. -
Rxlifecycle
在Android上使用rxjava都知道的一个坑,就是生命周期的解除订阅,这个框架通过绑定activity和fragment的生命周期完美解决.
Hello 我叫Jessyan,如果您喜欢我的文章,可以在以下平台关注我?