java dagger2_Rxjava + retrofit + dagger2 + mvp搭建Android框架详解
最近出去面试,总会被问到我们项目现在采用的什么开发框架,不过据我的经验网络框架(volley)+图片缓存(uIl)+数据库(orm)+mvp,不过现在这套框架比较好了,现在采用什么呢?Rxjava + retrofit + dagger2 + mvp。好,那我们接下来说说由这几种库来组成我们一个常用的开发框架(当然其他的还有一些什么推送什么的我们另当别论)。
借用google的一个MVP的说明图
项目总览
与常规的 MVP 不同的是,在 modle 层和 view 层通过EventBus 连接,当数据发生变化时,发出对应的 event,注册了这个 event 的 view会采取对应的措施。举个例子,退出登录用在这样的情形就很合适,在退出登录后,我们可能不止一个 view 会发生变化,如果把这些写在每一个 Presenter 中无疑是很不简洁的代码
在 modle 层中,抽象出了一个 DataManger,通过DataManger 我们与数据的具体实现进行了解耦,在 P 层我们无需关注数据是来自 DB ,SP 还是网络。我们只关心拿到的数据对象,而在DataManger 和 具体的数据实现中 还有一层 Helper层,这层封装了对数据的具体操作,比如 DBHelper、SPHelper、RetrofitServie,有了这一层封装可以很方便我们进行扩展。
DataManger 和 Helper累 中的方法拿到的都是 Observeable ,从而方便我们对这个流进行操控。 那么我们接下来根据这些不同库,来看看用这几种库组件框架怎么样呢
dagger2
项目使用了 dagger2 依赖注入框架解耦个层,使得单测和框架替换变得很容易。想要了解什么是依赖注入(控制反转)可以访问如下地址:http://blog.csdn.net/xiangzhihong8/article/details/51707776。
ApplicationComponent
首先看ApplicationComponent,他有一个Moudle,并且将这个Moudle中的提供的构造方法暴露出来,可以看到DatabaseHelper、PreferencesHelper等暴露出来的都是全局使用的对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent{
void inject(SyncService syncService);
@ApplicationContext Context context();
Application application();
RibotsService ribotsService();
PreferencesHelper preferencesHelper();
DatabaseHelper databaseHelper();
DataManager dataManager();
Bus eventBus();
}
###
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Module
public class ApplicationModule{
protected final Application mApplication;
public ApplicationModule(Application application){
mApplication = application;
}
@Provides
Application provideApplication(){
return mApplication;
}
@Provides
@ApplicationContext
Context provideContext(){
return mApplication;
}
@Provides
@Singleton
Bus provideEventBus(){
return new Bus();
}
@Provides
@Singleton
RibotsService provideRibotsService(){
return RibotsService.Creator.newRibotsService();
}
}
可以看到在ApplicationModule中的 provide 方法暴露出的方法对比ApplicationComponent中需要的方法,发现还缺了几项。DatabaseHelper、PreferencesHelper、DataManager。
1
2
3
4
5
6
7
8
@Inject
public DataManager(RibotsService ribotsService, PreferencesHelper preferencesHelper,
DatabaseHelper databaseHelper, EventPosterHelper eventPosterHelper){
mRibotsService = ribotsService;
mPreferencesHelper = preferencesHelper;
mDatabaseHelper = databaseHelper;
mEventPoster = eventPosterHelper;
}
用@Inject标注了构造方法,当注入了DataManager时,在module中找不到对应的 provide 方法,变会在构造方法中寻找,在递归的找参数中的注入… 以下是使用Draggle的一张图:
retrofit
再来看下 retrofit service 中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public interface RibotsService{
String ENDPOINT = "https://api.ribot.io/";
@GET("ribots")
Observable> getRibots();
/******** Helper class that sets up a new services *******/
class Creator{
public static RibotsService newRibotsService(){
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(RibotsService.ENDPOINT)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
return retrofit.create(RibotsService.class);
}
}
}
在构建了 Retrofit后再构建service,要是我来写的话会把Retrofit也用 dagger 注入的方式来提供。
DataManger
DataManger 基本上放的就是业务逻辑了,具体看个例子
1
2
3
4
5
6
7
8
9
public Observable syncRibots(){
return mRibotsService.getRibots()
.concatMap(new Func1, Observable>() {
@Override
public Observable call(List ribots){
return mDatabaseHelper.setRibots(ribots);
}
});
}
在syncRibots方法中,我们通过retrofit 获得网络的数据,再用 DB 存储,再把结果用Observable的结构返回给 P层,在这个例子中是在一个 service 中调用这个方法
java dagger2_Rxjava + retrofit + dagger2 + mvp搭建Android框架详解相关推荐
- eclipse搭建SSH框架详解
2019独角兽企业重金招聘Python工程师标准>>> SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题.下面我介绍一下SSH框架搭建的全过程. 第一 ...
- Cordova android框架详解
一.Cordova 核心java类说明 CordovaActivity:Cordova Activity入口,已实现PluginManager.WebView的相关初始化工作, 只需继承Cordova ...
- 从零开始搭建Android框架系列
原文链接:http://www.jianshu.com/nb/3767449 开篇介绍和工程目录结构[从零开始搭建android框架系列(1)] 不容错过,最全的安卓架构合集[从零开始搭建androi ...
- Android 动画框架详解,第 1 部分
2019独角兽企业重金招聘Python工程师标准>>> Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果,本文将向读者阐述 Android 的动画框 ...
- java编译器源码详解_已更新至第8章 | LLVM 编译框架详解
LLVM是什么? 我又不做编译器研究,干嘛要管它? 这是一些朋友想要对LLVM发起的提问,那么今天我们就来看看那款据说很酷炫的编译器--LLVM. LLVM是什么? LLVM是一个自由软件项目,它是一 ...
- Android 动画框架详解
Android 动画框架详解 基本原理 朱 韦伟, 软件工程师, IBM 李 浩, 软件工程师, 爱格码 简介: Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果.A ...
- android mvp模式例子_Android中mvp模式使用实例详解
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...
- dagger android,Dagger2 系列(三)Dagger2.Android使用详解
前言 前两篇文章我们介绍了dagger2的使用和基本原理,为了适用于android项目代码特点,更简洁的实现四大组件和Fragment的注入,dagger2团队为我们又进一步的封装,也就是我们要介绍的 ...
- Java 集合框架 详解
一.Java 集合框架概述 集合框架是一个用来代表和操纵集合的统一架构(java集合框架位于java.util包中).所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.例如 Collec ...
最新文章
- seaborn系列 (5) | 柱状图countplot()
- 基于vue的移动web app页面缓存解决方案
- 封装,多态,类的约束,super()深入了解
- Linux之ubuntu的网卡配置
- Python【每日一问】08
- POJ 3801/HDU 3157 Crazy Circuits | 有下界的最小流
- unity3d 材质概述 ---- shader
- 如何在Ruby on Rails迁移中重命名数据库列?
- (转)大公司里怎样开发和部署前端代码?
- 瑞星年度网络安全报告揭示 “互联网+”企业最“高危”
- iOS平台一套完善的Crash Report解决方案
- 基于SSM的猫头鹰在线视频网站
- 百度网盘也能BT下载ED2K
- 云计算(期末复习题含答案)
- 网络适配器黄色感叹号,无线网连接消失
- 中国移动下月发布5G套餐:“三不一快”策略方便终端入网
- mysql update join 更新_mysql多表join时候update更新数据的方法 | 很文博客
- LeetCode github集合,附CMU大神整理笔记
- 自己写的ajax通用 脚本
- 【踩坑】spconf.sty Latex样式模板的name包含下划线