最近出去面试,总会被问到我们项目现在采用的什么开发框架,不过据我的经验网络框架(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框架详解相关推荐

  1. eclipse搭建SSH框架详解

    2019独角兽企业重金招聘Python工程师标准>>> SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题.下面我介绍一下SSH框架搭建的全过程.  第一 ...

  2. Cordova android框架详解

    一.Cordova 核心java类说明 CordovaActivity:Cordova Activity入口,已实现PluginManager.WebView的相关初始化工作, 只需继承Cordova ...

  3. 从零开始搭建Android框架系列

    原文链接:http://www.jianshu.com/nb/3767449 开篇介绍和工程目录结构[从零开始搭建android框架系列(1)] 不容错过,最全的安卓架构合集[从零开始搭建androi ...

  4. Android 动画框架详解,第 1 部分

    2019独角兽企业重金招聘Python工程师标准>>> Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果,本文将向读者阐述 Android 的动画框 ...

  5. java编译器源码详解_已更新至第8章 | LLVM 编译框架详解

    LLVM是什么? 我又不做编译器研究,干嘛要管它? 这是一些朋友想要对LLVM发起的提问,那么今天我们就来看看那款据说很酷炫的编译器--LLVM. LLVM是什么? LLVM是一个自由软件项目,它是一 ...

  6. Android 动画框架详解

    Android 动画框架详解 基本原理 朱 韦伟, 软件工程师, IBM 李 浩, 软件工程师, 爱格码 简介: Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果.A ...

  7. android mvp模式例子_Android中mvp模式使用实例详解

    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...

  8. dagger android,Dagger2 系列(三)Dagger2.Android使用详解

    前言 前两篇文章我们介绍了dagger2的使用和基本原理,为了适用于android项目代码特点,更简洁的实现四大组件和Fragment的注入,dagger2团队为我们又进一步的封装,也就是我们要介绍的 ...

  9. Java 集合框架 详解

    一.Java 集合框架概述 集合框架是一个用来代表和操纵集合的统一架构(java集合框架位于java.util包中).所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.例如 Collec ...

最新文章

  1. seaborn系列 (5) | 柱状图countplot()
  2. 基于vue的移动web app页面缓存解决方案
  3. 封装,多态,类的约束,super()深入了解
  4. Linux之ubuntu的网卡配置
  5. Python【每日一问】08
  6. POJ 3801/HDU 3157 Crazy Circuits | 有下界的最小流
  7. unity3d 材质概述 ---- shader
  8. 如何在Ruby on Rails迁移中重命名数据库列?
  9. (转)大公司里怎样开发和部署前端代码?
  10. 瑞星年度网络安全报告揭示 “互联网+”企业最“高危”
  11. iOS平台一套完善的Crash Report解决方案
  12. 基于SSM的猫头鹰在线视频网站
  13. 百度网盘也能BT下载ED2K
  14. 云计算(期末复习题含答案)
  15. 网络适配器黄色感叹号,无线网连接消失
  16. 中国移动下月发布5G套餐:“三不一快”策略方便终端入网
  17. mysql update join 更新_mysql多表join时候update更新数据的方法 | 很文博客
  18. LeetCode github集合,附CMU大神整理笔记
  19. 自己写的ajax通用 脚本
  20. 【踩坑】spconf.sty Latex样式模板的name包含下划线

热门文章

  1. 【办公】解决京瓷打印机总是出现烦人的“在手送纸盘中装纸 彩色纸”的问题
  2. 互联网会成为人类的敌人么?
  3. 免费实用的API接口
  4. 力扣 刷题77 组合排序,剪枝
  5. js拖拽onmousedown onmouseup onmousemove案例
  6. 使用vue-cli创建uni-app项目
  7. 高新兴智慧执法体系 亮相安博会
  8. 长沙软件测试员遇到瓶颈了怎么办?
  9. jgit ssh java_java – 为JGit指定SSH密钥
  10. flex布局实现左边图片与右边文字同等高