原文地址: http://www.jianshu.com/p/48e66e879061
今年的Android技术圈中MVP
,Dagger2
,Rxjava
,Retrofit
这些词汇非常火,随便打开一个技术论坛都充斥着大量的关于这些技术的文章,Github
也充斥着各种以基于MVP+Retrofit+RxJava+Dagger2+MaterialDesign开发的xxxx
为标题的开源项目或Demo.
但是大家这么热心的开源此类项目,一直重复的做着同样的事教授大家使用的方式和技巧
有没有想过依赖一个第三方库,就可以快速的搭建此类框架?
MVPArms
是一个集成了大量Android主流框架,并且全部使用Dagger2管理,以及提供API将所有库连接起来方便使用,还提供详细的Wiki文档.
它可以使开发后面的所有项目都不用重复的复制粘贴(用过此类框架的朋友应该知道,这些库都依赖其它的库,就算一个build.gradle都会浪费很多时间),一个依赖省去很多烦恼,而且对于新手来说这些框架难的不仅仅是API的使用,更难的是怎么把它们结合到一起,应对各种场景的使用.
对于一个新的Android项目,特别是熟练使用Dagger2和Rxjava的开发者,你们只需要将此项目Clone下来,Demo只实现了一个页面,将此页面删除掉,添加所需要的RetrofitAPI,你的框架就搭建好了,你就可以直接使用Demo进行后续的开发,包结构也适合后面的扩展.
通用框架,适合所有类型的项目,支持大型项目的开发,兼容组件化开发,可作为组件化的 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 使用策略模式和建造者模式,轻松切换图片加载框架,方便功能扩展
修改包名后就可以直接使用,快速接入(老项目接入请按下面的步骤)
根据
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);
}
}
一般让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实现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在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) {
}
}
感谢本框架所使用到的所有三方库的Author,以及所有为
Open Sourece
做无私贡献的Developer和Organizations,使我们能更好的工作和学习,本人也会将业余时间回报给开源社区
Dagger2
Google根据Square的Dagger1出品的依赖注入框架,通过Apt编译时生成代码,性能优于使用运行时反射技术的依赖注入框架.
Rxlifecycle
在Android上使用rxjava都知道的一个坑,就是生命周期的解除订阅,这个框架通过绑定activity和fragment的生命周期完美解决.
Hello 我叫Jessyan,如果您喜欢我的文章,可以在以下平台关注我?
粉丝
关注
积分
访问