原文地址: http://www.jianshu.com/p/48e66e879061
Logo
MVP
,Dagger2
,Rxjava
,Retrofit
这些词汇非常火,随便打开一个技术论坛都充斥着大量的关于这些技术的文章,Github
也充斥着各种以基于MVP+Retrofit+RxJava+Dagger2+MaterialDesign开发的xxxx
为标题的开源项目或Demo.教授大家使用的方式和技巧
有没有想过依赖一个第三方库,就可以快速的搭建此类框架?MVPArms
是一个集成了大量Android主流框架,并且全部使用Dagger2管理,以及提供API将所有库连接起来方便使用,还提供详细的Wiki文档.- [一键生成 app Module (使用此 **Module 级** 模板可直接生成 **Wiki** 文档第一章 **开发准备** 的所有内容, 快速并且零错误)](https://github.com/JessYanCoding/MVPArms-Module-Template)
- [一键生成 MVP, Dagger2 相关类 (使用此 **页面级** 模板可直接生成 **Wiki** 文档第二章 **快速开始** 的所有内容, 快速并且零错误)](https://github.com/JessYanCoding/MVPArmsTemplate)
扩展项目, 了解一下:
Architecture
package
根据
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注入,这样即解藕又方便测试,怎么注入?
@ActivityScope
public 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,使我们能更好的工作和学习,本人也会将业余时间回报给开源社区
Mvp
Google官方出品的Mvp
架构项目,含有多个不同的架构分支(此为Dagger分支).Dagger2
Google根据Square的Dagger1出品的依赖注入框架,通过Apt编译时生成代码,性能优于使用运行时反射技术的依赖注入框架.Rxjava
提供优雅的响应式Api解决异步请求以及事件处理.RxAndroid
为Android提供响应式Api.Rxlifecycle
在Android上使用rxjava都知道的一个坑,就是生命周期的解除订阅,这个框架通过绑定activity和fragment的生命周期完美解决.RxCache
是使用注解为Retrofit加入二级缓存(内存,磁盘)的缓存库.RxErroHandler
是 Rxjava
的错误处理库,可在出现错误后重试.RxPermissions
用于处理Android运行时权限的响应式库.Retrofit
Square出品的网络请求库,极大的减少了http请求的代码和步骤.Okhttp
同样Square出品,不多介绍,做Android都应该知道.Autolayout
鸿洋大神的Android全尺寸适配框架.Gson
Google官方的Json Convert框架.Butterknife
JakeWharton大神出品的view注入框架.Androideventbus
一个轻量级使用注解的Eventbus.Timber
JakeWharton大神出品Log框架容器,内部代码极少,但是思想非常不错.Glide
此库为本框架默认封装图片加载库,可参照着例子更改为其他的库,Api和Picasso
差不多,缓存机制比Picasso
复杂,速度快,适合处理大型图片流,支持 gif 图片,Fresco
太大了!在5.0以下优势很大,5.0以上系统默认使用的内存管理和Fresco
类似.LeakCanary
Square出品的专门用来检测Android
和Java
的内存泄漏,通过通知栏提示内存泄漏信息.Hello 我叫Jessyan,如果您喜欢我的文章,可以在以下平台关注我?