使用Dagger ,Rxjava ,LiveData,ViewModel等搭建App框架

由于licence,可能出现的安全问题和不好的影响等,删除原来的Repo。

请clone过老项目的同学也删除

新Repo代码GitHub链接点这里

使用Dagger ,Rxjava ,LiveData,ViewModel等搭建App框架

根据项目中出现的工程问题以及平衡业务需求,重构希望能把关注点集中到代码结构、整体架构、可测试性、可维护性以及快速迭代这四个方面。本次迭代除了使用Dagger,Rxjava,Retrofit,Greendao 等外,新引入了Google官方JetPack组件中的LiveData,ViewModel,LifeCycle,WorkManger等。并把工程框架变为模块化,独立的业务模块可以单独的进行调试,管理。

项目的框架图如下

项目的框架图

项目框架图如上图所示,这里约定一个称谓:Main,News可以单独依赖Base调试,App壳工程也可以把他们打包集合到一起调试,我们称为App模块化架构。如下图切换后Sync一下工程


切换模块化开发模式.png

这样的好处是
1.Base可以在同一公司的多个项目共用
2.负责Main,New业务的开发可以只关注自身的git 权限管理,编译调试(大大减少带薪Build 时间)
3.工程框架清晰,更容易维护

ViewModel+LiveData 的封装处理

ViewModel和LiveData 官方Jetpack组件重要组成部分。

  • ViewModel 当因系统配置发生改变导致 Activity 重建的时候(比如旋转屏幕,更改系统语言),能对 LiveData 进行正确的保存和恢复(当然这要配合 LiveData)。当然如果是系统资源紧张被清除是不能恢复的。
  • LiveData 的作用是在使得数据能具有生命周期感知能力,在 Activity 等变为活跃状态的时候,自动回调观察者中的回调方法,也就是说对数据的变化进行实时监听。这样就不会出现异步请求数据成功后UI不活跃的时候出现空指针异常,也可以很好的避免内存泄露

但是onChange 观察回调官方只是处理成功数据的回调,我们需要封装StateLiveData处理网络错误,服务器自定义的一些返回码等情况

        //LiveData 具有生命周期感知能力,它会自动对这些进行管理
        //UI 组件只需要对相关的数据进行监听,不需要关心是否应该暂停或者恢复监听。 
        blogViewModel.getAllBlog().observe(this, stateData -> {
            switch (stateData.getStatus()) {
                case SUCCESS:
                    disposeSuccessData(stateData.getData());
                    break;
                case ERROR:
                    disposeErrorMsg(stateData.getMsg())
                    break;
            }
        });
权侵删

而使用Retrofit请求网络业务层的写法也是非常的精简

    public StateLiveData<HotNewsResult> getStateLiveData() {
        //1.异步加载网络请求数据
        newsApiService.getNews()
                .compose(SwitchSchedulers.applyScheduler2())//rxjava 切换线程
                .subscribe(new HttpObserver<NewsResult>() {
                    @Override
                    public void onSuccess(NewsResult newsResult) {
                        stateLiveData.postSuccess(newsResult);
                    }

                    @Override
                    public void onFailure(int code, String message) {
                        super.onFailure(code, message);
                        //把错误信息告知给UI操作层面
                        stateLiveData.postFailure(message + code);
                    }
                });
        return stateLiveData;
    }

Dagger 和ViewModel 结合遇到的问题

项目使用的是Dagger2和Dagger.android,在Demo工程中看起来很繁琐,代码量也很多,但是配置好了一劳永逸) 。随着项目业务变多的时候dagger相关的代码不会变多,但是能让业务代码化繁为简并解耦。

但是Dagger 和ViewModel结合的时候会有点麻烦。定义好ViewModelKey 和 class MyViewModelFactory implements ViewModelProvider.Factory后,其实 和在一个Activity/Fragment中使用Dagger 差不多。

关于多个系统提供数据(多BaseUrl),返回的json 数据格式还不一样的情况处理

很多App都是多个BaseUrl,数据由不同的系统提示,甚至内部Python和Java 后台返回的数据json 格式还不一样,那就要抽象Base出来了,demo 的Blog和News 演示了这一情况

Retrofit 全局屏蔽重复请求

应该没有比Retrofit2 更好的了吧?不过api 不是restful 就需要再封装一下了,网路模块就是数据命脉,做好了
整个app 的结构会简化很多,结合Rxjava2更能简化很多。假如点击一个按钮请求数据除了从源头防止还能不能从发起请求的时候检查。

数据的持久化

SP
ORMDB (Room,GreenDao,xx)

项目中包含的基本的通用模块

  • Dagger.android 大大的优化Dagger 在android 中的使用,
  • BaseActivity 中Toolbar 的处理
  • 进行网络请求时候的Error,empty,Loading,timeout等通用场景处理,Demo中一处Root注入,处处可用
  • Http (Rxjava2+Retrofit2)的闭环处理
  • 聚合型API处理(从不同的系统获取数据,返回的API 结构不同,详细见thirdParty 包下的处理)
  • 封装StateLiveData 以便处理失败和业务异常
  • dagger 和ViewModel 的结合处理

希望大家会喜欢,并在GitHub提出宝贵意见

参考资料:

  • [1]. Google 应用架构指南
  • [2]. LiveData ViewModel Overview
  • [3]. Dagger - A fast dependency injector for Android and Java
  • [4]. Android Jetpack 使用入门
    ... ...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266