前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android组件化搭建

Android组件化搭建

作者头像
我就是马云飞
发布2018-02-05 10:54:08
9260
发布2018-02-05 10:54:08
举报

组件化开发

组件化开发这个名词并不陌生,但真正什么才是组件化开发,大家在网上搜可以查看很多相应的文章,我概念中,模块化的开发,就是把很多模块独立出来,基础模块,业务模块等。什么是基础模块,基础模块就是公司常用的一些sdk,一些封装好的基类,业务模块就是基于基础模块进行开发的。在以往的开发中,我并未真正的去使用组件化开发,直到加入新的团队可以说是开启新世界的大门,给我的感觉,组件化开发,贼爽,为什么爽?

我总结了好几点:

1.各自负责业务模块独立开发,以application进行开发,后期再以library引入项目 2.因为每个模块独立出来,以最小模块的进行开发,编译速度快 3.有利于单元测试,对业务模块进行单元测试 4.降低耦合,提高模块的复用

以下为基础模块包:

整个项目结构:

Android studio:

在gradle.properties中,我们可以设置一个变量,控制是否使用模块化来开发:

#是否使用模块化开发
isModule=false

然后在settings.gradle中设置项目引入包

业务模块gradle进行模块判断

根据结构图,我们基础模块的依赖,默认引入sdk、model、widget、module-baisc然后根据自己负责的业务模块,分别引入不同的业务,如果我是负责用户模块,我在开发就只需要引入用户模块即可,这样开发每个模块的时候可以提高每个模块的编译效率。

最后模块合并的时候,在gradle.properties中关闭模块开发,在settings.gradle引入项目相应的模块包,并设置app的build-gradle:

build-gradle:

现在的问题,不同模块的activity怎么跳转,以前我的做法都会在每个activity中写一个静态方法,把入参设定好.

因为使用模块化开发的话,不同业务模块是不能调用其activity,因此我们使用阿里的Arouter, 在每个activity头部使用注解进行跳转,就像Spring mvc 的controller一样,使用路由进行设置跳转,在模块化的开发中,这个很关键,一方面使用arouter可以降低activity之间的耦合,另一方面可以对模块进行单元测试。

Arouter具体的使用方法: https://github.com/alibaba/ARouter

Retrofit+Rxjava+MVP模式

关于Retrofit跟RxJava,具体详细的用法就不在这里介绍,网上有很多现有的文章,为什么使用Retrofit跟RxJava,Retrofit是基于Okhttp封装一层的客户端,配合RxJava线程调度,很好的控制网络请求,使用RxJava可以提高代码的可读性,这里我分享一下retrofit+Rxjava封装。

1.基于Retrofit的Api工厂

ApiFactory如下图:

图中的ApiFactory的职责是提供所有业务Api接口,具体提供的Api是通过接口ApiProvider提供每个业务接口,如果用户接口,交易接口,令牌接口等,ApiFactory通过单例,获取api提供者,ApiProvider具体的实现类ApiProvideImpl继承于网络引擎RetrofitApi,RetrofitApi用于初始化一些网络引擎。ApiProvideImpl中使用retrofit来初始化各种Api接口。

ApiProviderImpl.java:

2.MVP

使用mvp可以解耦,结构清晰,对于业务复杂的场景来说,可以提高代码可读性,结构清晰,降低后期维护成本。如下图登录模块所示:

View跟presenter都抽象成接口,这样相互不依赖于细节,有易于做单元测试,降低耦合。这里有两个基础接口,LoginView跟LoginPresenter分别继承于IView跟IPresenter,LoginViewImpl以及LoginPresenterImpl分别实现LoginView跟LoginPresenter,其依赖于抽象不依赖于实现的细节。

/**
 * 登录契约类
 */
public interface LoginContract {

    /**
     * 表现层接口
     */
    interface Presenter extends IPresenter {

        /**
         * 登录操作
         */
        void login();
    }

    /**
     * 视图层接口
     */
    interface View extends IPresenterView {

        /**
         * 获取密码
         *
         * @return return
         */
        String getPassword();

        /**
         * 获取用户信息
         *
         * @return return
         */
        String getUsername();

        /**
         * 登录成功
         */
        void loginSuccess();

        /**
         * 登录失败
         *
         * @param msg msg
         */
        void loginFailed(String msg);
    }
}

我们通过定义一个Contract契约类,来制定接口,在定Presenter跟view接口的同时,我们可以很清晰的知道,表现层需要什么东西,view层需要提供什么东西,包括网络请求后相应的响应,这样在我们做一个业务逻辑的时候思路可以更清晰,同事在进行presenter复用以及单元测试会更方便。

3.结合Retrofit+RxJava+Mvp

结合之前谈到的Api跟mvp,在这个基础上进行封装Presenter的实现基础类。

基础Presenter封装了绑定与解绑的操作,presenter跟view解绑时调用destory释放资源,并把此presenter中使用rxJava处理得事件全部清掉,释放资源,例如一些网络请求,当view跟presenter解绑后网络请求未来得及返回处理,容易出现view空指针的操作。

接着介绍一下RxObservable的封装:

在RxObservable中,创建一个sObservableDisposableList用于保存每个presenter中处理的事件,通过tag作为标识创建,每个presenter中会通过tag找到对应的Disposable集合,Disposable集合中保存了此presenter中的所有任务,如网络请求、io操作等,通过此方法可以统一管理tag的任务,在presenter解绑的时候可以及时的销毁资源,避免内存泄露。

登录的一个小例子:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我就是马云飞 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.基于Retrofit的Api工厂
  • 2.MVP
  • 3.结合Retrofit+RxJava+Mvp
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档