您的位置:首页 > 移动开发 > Android开发

Rxjava + retrofit + dagger2 + mvp搭建Android框架

2016-06-18 23:28 549 查看
最近出去面试,总会被问到我们项目现在采用的什么开发框架,不过据我的经验网络框架(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 中调用这个方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: