专栏首页向治洪Rxjava + retrofit + dagger2 + mvp搭建Android框架

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中需要的方法,发现还缺了几项。DatabaseHelperPreferencesHelperDataManager。

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 中调用这个方法

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • android 应用模式之mvp

    说到MVP就不得不提到MVC,做过J2EE的猿友们肯定知道MVC是个什么东西。MVC即 Model、View、Controller, 那MVP就Model、Vi...

    xiangzhihong
  • React Native使用原生组件

    概述 有时候App需要访问平台API,但React Native可能还没有相应的模块包装;或者你需要复用一些Java代码,而不是用Javascript重新实现一...

    xiangzhihong
  • 桥接模式

    概述 当一个抽象对象可能有多个 实现时,通常用继承来协调他们。抽象类定义对该抽象的接口,而具体的子类则用不同的方式来实现。但是此方法有时候不太灵活。继承机制将抽...

    xiangzhihong
  • 一个 android 的框架

    最近在 github 上看到一个 android 的框架,结合了 Rxjava + retrofit + dagger2 + mvp,结合了当下比较流行的框架,...

    用户1263308
  • 源码分析Retrofit请求流程

    Retrofit 是 square 公司的另一款广泛流行的网络请求框架。前面的一篇文章《源码分析OKHttp执行过程》已经对 OkHttp 网络请求框架有一个大...

    阳仔
  • Glide的图片下载进度

    好久没有写简书了,都荒废了自己,今天整理了一下以前的代码和目前现有的项目代码,看了关于gradle图片下载进度的代码,这边整理了Glide3.7.0和Glide...

    包子388321
  • PHP反射类export方法详细解析

    CrazyCodes
  • XStream、JAXB 日期(Date)、数字(Number)格式化输出xml

    XStream、Jaxb是java中用于对象xml序列化/反序列化 的经典开源项目,利用它们将对象转换成xml时,经常会遇到日期(Date)、数字按指定格式输出...

    菩提树下的杨过
  • 聊聊spring cloud的RequestRateLimiterGatewayFilter

    本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter

    codecraft
  • 惊呆了,Servlet Filter和Spring MVC Interceptor的实现居然这么简单

    在工作中,我们经常要和Servlet Filter,Spring MVC Interceptor打交道,虽然我配置写的很6,但是对实现方式还是挺好奇的,于是看了...

    Java识堂

扫码关注云+社区

领取腾讯云代金券