MVVMArms - MVVM 与 Android Architecture Components 的最佳实战

首先感谢 JessYan 开源的 MVPArms,学到了很多知识,也方便了公司项目的开发!
在 Google I/O 2017 大会上,Google 推出了新的组件库 - Android Architecture Components,官方文档做的很详细,分别介绍了各个组件的应用场景和使用方式,这无疑会推进 Android MVVM 模式的发展。关于 MVVM 这里不做过多介绍,如果有需要可以自行搜索。

正文

Android Architecture Components 简介

先来看一下 Android Architecture Components 包含哪些内容:

加上之前推出的 Data Binding Library

如果想要引用 Components,可参考以下链接:

注意:如果你无法访问 Google Maven 库,可以使用以下地址代替:
maven { url "https://dl.google.com/dl/android/maven2" }

这里需要特别说明的是,ViewModel 相当于 MVVM 的 VM 层,它和 View 是通过 Data Binding 双向绑定的,ViewModel 不再持有 View 的引用,而是存储UI相关的数据;而且 ViewModel 是生命周期感知的,当创建它的 Activity/Fragment 销毁时,ViewModel 会自动销毁。

MVVMArms 框架图

这里引用 官方 架构图,参考 MVPArms 做了一些修改。

MVVMArms _Architecture
MVVMArms _Architecture

整个框架采用 Dagger 进行依赖注入,并使用了最新的 Dagger.Android,组织好 ModuleComponents,框架会自动注入。具体可参考 demo。

MVVM 组件的封装

Model

框架中,数据的获取是通过 Model 层获取的,在 Model 中持有一个数据管理类对象- RepositoryManager(实现了 IRepositoryManager 接口),分别可以通过 Retrofit
获取网络数据,通过 Room 获取 SQLite 数据库中的持久化数据。具体实现可查看源码链接:

Room 的使用需要在 gradle 中添加:

android {
...

    //Room
    javaCompileOptions {
        annotationProcessorOptions {
            arguments = ["room.schemaLocation":
                                 "$projectDir/schemas".toString()]
        }
    }
}

ViewModel

ViewModel 是整个框架比较新颖和重要的部分,BaseViewModel 继承于 Components 中的 AndroidViewModel,并实现了 LifecycleObserver 接口;它持有 Model 的引用,主要的业务逻辑都是在 ViewModel 中实现的;ViewModel 中UI相关的数据通过 LiveData 包装,使得当数据变化时,自动反映到UI上,实现了数据UI。在 xml 布局文件中,通过 Data Binding 绑定对应的 ViewModel。 BaseViewModel 源码如下:

View

框架封装了 ArmsActivityArmsFragment,它们都实现了 Components 中的 LifecycleRegistryOwner 接口来处理生命周期。上面提到在 xml 布局中绑定 ViewModel,而 ViewModel 的创建和生命周期绑定是在 Activity/Fragment 中进行的,具体是通过 Components 中提供的 ViewModelProviders 类完成的。下面是创建 ViewModel 的实例:

//创建ViewModel
mViewModel = ViewModelProviders.of(this, mViewModelFactory).get(WeatherViewModel.class);
  • mViewModel 是通过泛型封装在 ArmsActivityArmsFragment 中的;
  • 同样,mViewModelFactory 是通过 Dagger 将 ViewModelFactory 注入在 ArmsActivityArmsFragment 中的。
  • ViewModelProviders.of() 是一个重载的方法,通过传入的第一个参数,限定该 ViewModel 与 哪个 Activity/Fragment 进行生命周期绑定。

创建好了 ViewModel 后,在 ArmsActivityArmsFragment 设置 ViewModel 监听 Lifecyle 的回调:

if (mViewModel != null)
    getLifecycle().addObserver((LifecycleObserver) mViewModel);

同时,需要将上述提到的 xml 中绑定的 ViewModel 进行设置,这就很简单了,示例代码如下:

mBinding.setViewModel(mViewModel);

源码链接:

Github

更多细节请移步 Github,写了一个简单的 demo,欢迎 star、fork,issue、pr,希望可以一起交流:

参考

联系

我是 xiaobailong24,您可以通过以下平台找到我:

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,396评论 2 45
  • 在对MVP的架构实践中,发现写单元测试不是那么方便,因为Presenter持有了View的引用,而Mock Vi...
    Mr云台阅读 2,016评论 1 5
  • 高频的学习生活,一批批作业让自己如陀螺一般转着,整个人处于心累却不困的状态,此时外界的声音仿佛都可以被自己屏蔽,只...
    十二yql阅读 243评论 0 1
  • 作者:温馨万家 很晚了,喧闹了一天的田地里异常静谧,偶尔传来蟋蟀的悉悉索索的声音,和着庄稼熟透的香味,给人一种温馨...
    魏喜梅wxm阅读 472评论 0 3