安卓MVVM实践

MVVM

MVVM

Model

Model refers either to a domain model, which represents real state content (an object-oriented approach), or to the data access layer, which represents content (a data-centric approach).

View

As in the MVC and MVP patterns, the view is the structure, layout, and appearance of what a user sees on the screen.

ViewModel

The view model is an abstraction of the view exposing public properties and commands. Instead of the controller of the MVC pattern, or the presenter of the MVP pattern, MVVM has a binder. In the view model, the binder mediates communication between the view and the data binder. The view model has been described as a state of the data in the model.

Binder

Declarative data and command-binding are implicit in the MVVM pattern. In the Microsoft solution stack, the binder is a markup language called XAML. The binder frees the developer from being obliged to write boiler-plate logic to synchronize the view model and view. When implemented outside of the Microsoft stack the presence of a declarative databinding technology is a key enabler of the pattern.

MVVM好处

mvc vs mvp vs mvvm

MVC

Activity/Fragment既承担了View的责任,又承担了Controller的责任。所以一般较复杂的页面,Activity/Fragment通常几千行代码都是小意思,而且Controller混杂了View和业务逻辑,这样想对业务逻辑来做单元测试也是非常困难的。

MVP

引入Presenter,让Activity/Fragment做回真正的View。Presenter持有View的接口引用。Activity/Fragment值负责UI的事情,业务逻辑放到Presenter处理。Presenter只是持有View的接口,这样使得对Presenter做单元测试变得可能。

MVVM

MVVM对MVP的升级版本,使用DataBinding,Command,消息事件让架构更加灵活。

  • 数据驱动
    ViewModel只关心数据和业务逻辑,基本不需要做UI操作,是需要修改数据,databinding就能自动同步更新UI。UI的修改,又会自动同步到数据中。
  • 低耦合
    ViewModel不涉及任何UI操作和对UI控件的引用,就算你把TextView改成EditText,ViewModel几乎不需要改任何代码。
  • 团队协作
    View和ViewModel松散耦合,一个人做UI(XML + Activity),另外一个人做ViewModel 。
  • 单元测试
    比MVP更进一步,View和ViewModel的单元测试都很方便。

Android Architecture Components

MVVM

ViewModel

ViewModel需要继承android.arch.lifecycle.ViewModel。为特定的UI组件提供数据,比如:Activity、Fragment等,并处理与业务的通讯,比如调用其他组件加载数据。ViewModel与View之间相互隔离,并且不受activity屏幕旋转导致activity重新创建的影响。

LiveData

View和ViewModel通过LiveData来传递消息和数据。LiveData是一个可观察的数据持有者,他可以让APP中的组件观察LiveData是否发生改变,而且不需要他们之前有严格的相互依赖关系。LiveData还会遵循应用程序组件(Activity,Fragment, Service)的生命周期状态来避免内存泄露,从而使你的APP不会消费太多的内存(LiveData是生命周期感知的。这意味着除非fragment是激活状态(onStart但是还没有onStop),要不然是不会发起回调的。当fragment调用onStop后, LiveData还会自动删除观察者。)。

Model

Repository代码Model层,可以通过Room框架操作数据库,或者通过调用http接口来获取数据。Repository返回LiveData到ViewModel。

详情请看:http://www.jianshu.com/p/b6d91bffcfa4

Google官方BasicSample代码分析

项目地址:https://github.com/googlesamples/android-architecture-components/tree/master/BasicSample

View和ViewModel通过LiveData串联起来,还需要注意以下规则:

  • ViewModel不能关联到任何Activity、Fragment和android View,如果这样的话可能会引起内存泄露。因为View的整个生命周期都会保留一个ViewModel的引用。
ViewModel
  • ViewModel通过LiveData暴露数据,LiveData可以让你不用有严格的依赖关系跨越多个组件观察数据的变化。

  • View,官方例子中,订阅以下的LiveData数据。因为LiveData是生命周期感知的,如果观察者不是处于激活状态,它不会push数据更新给到他们,这样能够帮忙避免许多常见的问题。

// Update the list of products when the underlying data changes.
        viewModel.getProducts().observe(this, new Observer<List<ProductEntity>>() {
            @Override
            public void onChanged(@Nullable List<ProductEntity> myProducts) {
                if (myProducts != null) {
                    mBinding.setIsLoading(false);
                    mProductAdapter.setProductList(myProducts);
                } else {
                    mBinding.setIsLoading(true);
                }
            }
        });
image.png
  • mIsDatabaseCreated设置false(开始初始化数据库),ProductListViewModel接收到后转化为null传给ProductListFragment,ProductListFragment通过databinding在UI上显示Loading UI。

  • mIsDatabaseCreated设置为true(数据库初始化完成),ProductListViewModel接收到后,通过DatabaseCreator查询到List<Product> Livedata返回给ProductListFragment,ProductListFragment通过databinding去除Loading UI,并且设置mProductAdapter显示所有Product。

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

推荐阅读更多精彩内容