Rxjava + retrofit + dagger2 + mvp搭建Android框架详解手机开发

最近出去面试,总会被问到我们项目现在采用的什么开发框架,不过据我的经验网络框架(volley)+图片缓存(uIl)+数据库(orm)+mvp,不过现在这套框架比较好了,现在采用什么呢?Rxjava + retrofit + dagger2 + mvp。好,那我们接下来说说由这几种库来组成我们一个常用的开发框架(当然其他的还有一些什么推送什么的我们另当别论)。

借用google的一个MVP的说明图

项目总览

Rxjava + retrofit + dagger2 + mvp搭建Android框架详解手机开发

与常规的 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的一张图:
Rxjava + retrofit + dagger2 + mvp搭建Android框架详解手机开发

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

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/app/5890.html

(0)
上一篇 2021年7月17日 00:22
下一篇 2021年7月17日 00:22

相关推荐

发表回复

登录后才能评论