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<List<Ribot>> 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<Ribot> syncRibots() { return mRibotsService.getRibots() .concatMap(new Func1<List<Ribot>, Observable<Ribot>>() { @Override public Observable<Ribot> call(List<Ribot> ribots) { return mDatabaseHelper.setRibots(ribots); } }); } |
在syncRibots
方法中,我们通过retrofit 获得网络的数据,再用 DB 存储,再把结果用Observable
的结构返回给
P层,在这个例子中是在一个 service 中调用这个方法
Rxjava + retrofit + dagger2 + mvp搭建Android框架的更多相关文章
- android完整资讯App、Kotlin新闻应用MVP + RxJava + Retrofit + Dagger2、优雅区间选择器等源码
Android精选源码 Android完整资讯客户端源码 android展示注册进度效果源码 Android Wifi热点数据传输Socket 通信示例源码 Android Dota的辅助信息app源 ...
- 从零开始搭建android框架系列(转)
网址:从零开始搭建android框架系列 githup:https://github.com/CameloeAnthony/Ant
- 学习RxJava+Retrofit+OkHttp+MVP的网络请求使用
公司的大佬用的是这一套,那我这个菜鸟肯定要学习使用了. 我在网上找了很多文章,写的都很详细,比如 https://www.jianshu.com/u/5fd2523645da https://www. ...
- 一个C#开发搭建Android框架的心路历程
前言 Java框架实在是太多了,因为是初学乍练,所以,只好以百度为标准选择框架了. Java的框架文章太难写了,因为他引用了太多框架,而没一个框架都有很繁琐的配置,把每个框架都写一遍,就等于写书了:所 ...
- RxAndroid+RxJava+Gson+retrofit+okhttp初步搭建android网络请求框架
新建工程集成, 一.工具集成(2017-4-27) 首先第一步集成retrofit retrofit 的 git 网站: https://github.com/square/retrofit 在git ...
- 手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界
0.0 Android开发现在的变化用一个词来形容就是 :翻天覆地 越来越多的项目使用了MVP + Rxjava+Retrofit +Dagger2 + DataBinding等等东西.. 但是这些东 ...
- 【Android - 框架】之Retrofit+RxJava的使用
前几天分别对Retrofit和RxJava进行了总结,这个帖子打算把Retrofit结合RxJava使用的方法总结以下.有还不了解Retrofit或RxJava的朋友可以参考下面的帖子学习~ [And ...
- [Android] 转-RxJava+MVP+Retrofit+Dagger2+Okhttp大杂烩
原文url: http://blog.iliyun.net/2016/11/20/%E6%A1%86%E6%9E%B6%E5%B0%81%E8%A3%85/ 这几年来android的网络请求技术层出不 ...
- Android二手交易平台,dagger2+mvp+Bmob后台云搭建
二手交易平台 我的毕业设计项目安卓源码,二手交易平台,dagger2+mvp+Bmob后台云搭建,集成了百度地图,友盟三方登录等 系统架构 Dagger2+MVP分层,完成了一次正常的retrofit ...
随机推荐
- Angular2入坑指南
序 对后端开发来说,前端是神秘的,眼花缭乱的技术,繁多的框架,出名的不出名的好几百种,看是"繁荣",其实显得杂乱无章,但是我们在做开发的时候,技术选型还是主流的那么几个:浅析ang ...
- 如何编写入门级redis客户端
概述 Redis是开源的.基于内存的数据结构存储系统,可用作数据库.缓存以及消息代理方面.Redis支持许多种数据结构,并内置了丰富的诸如冗余.脚本.事务.持久化等功能,深受业界喜爱,被各种业务系统广 ...
- 微信开发获取地理位置实例(java,非常详细,附工程源码)
在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一些必要的配置,以及如何调用微信接口. 2.微信开发之通过代理调试 ...
- Dynamics CRM2016 升级老版本报“JavaScript Web 资源包含对 Microsoft Dynamics CRM 4.0 (2007) Web 服务终结点的引用”问题的解决办法
今天在新的服务器上部署了CRM2016 on-premises,并将CRM2015的数据库拷贝过来准备附加后升级,但在升级过程中遇到了如下错误,向导检测到了我的JavaScript Web 资源中包含 ...
- ubuntu挂载的NTFS文件编译失败问题
错误: 编译Android源代码时候出现,权限拒绝的错误 解决方法: sudo apt-get install ntfs-config sudo ntfs-config 我的微信二维码如下,欢迎交流讨 ...
- memcached实战系列(四)memcached stats命令 memcached优化
memcached提供一系列的命令进行优化的查看,方便我们调整我们的存储策略,查看我们的使用率,内存的使用率以及浪费情况.常用的命令有stats.stats settings.stats items. ...
- [supervisor] 使用小记(入门教程)
之前到现在很久没有用了,还是从安装说下,做个简单的实验,系统为Ubuntu14.04 快速安装配置 sudo pip_python install supervisor sudo echo_super ...
- 最简单的基于FFmpeg的编码器-纯净版(不包含libavformat)
===================================================== 最简单的基于FFmpeg的视频编码器文章列表: 最简单的基于FFMPEG的视频编码器(YUV ...
- 01 Android修改新建虚拟机存放的位置
创建的Android虚拟机(即AVD)的位置是在C盘的当前用户文件夹下(C:\Users\用户名\.android\avd) 这一默认设置不怎么好,特别是C盘空间吃紧的话. 这里提供2个解决办法(分2 ...
- (一〇二)静态库(.a)的打包
库是代码的集合,根据代码公开程度,分为开源库和闭源库. 其中闭源库主要包括静态库和动态库,是经过编译的二进制文件,看不到具体实现. 静态库的拓展名是.a或者.framework,动态库则是.dylib ...