Android jetpack - ViewModel 存储和管理界面相关的数据

一、前言

ViewModel 可观察数据存储类属于谷歌在2018推出Android jetpack(外网)其中的软件架构组件中的一个。在谷歌开发者网站有详细介绍ViewModel(外网)。

全文就一句话
ViewModel核心:存储和管理界面相关的数据
理解此文前建议简单阅读Lifecycle,理解生命周期组件

二、ViewModel

谷歌爸爸介绍
ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel类让数据可在发生屏幕旋转等配置更改后继续存在。

ViewModel使用场景
ViewModel的使用主要是独立存储和管理界面相关的数据,把界面数据分离出来用ViewModel来管理。
比如Activity/Fragment要重复的打开关闭,若数据时一些网络请求什么的,不必每次创建都去异步请求,请求一次,ViewModel统一管理就好。

为什么例子中的ViewModel都是管理LiveData
ViewModel管理的数据可以是多种,只不过我们更多的管理LiveData,因为LiveData有观察者模式+生命周期特性,方便数据变化时去改变界面。所以他们形影不离。
因为你的目的就是数据变化了去更改UI,如果不用LiveData,就普通的一个String,你得加个回调监听或者别的方式通知到UI你数据已经变化了,你得判断空,判断context是否还存在,等等。思想上他们是相同的。

三、详细介绍

ViewModel总结来就是下面

  • 1、生命周期
  • 2、Fragment间共享数据
  • 3、使用场景

3.1、生命周期

ViewModelProvider.Factory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication());
ViewModelProvider viewModelProvider = new ViewModelProvider(this, factory);
viewModel = viewModelProvider.get(MyViewModel.class);
  • ViewModel创建是:传递给ViewModelProvider一个Lifecycle(代码中的this)+工厂模式来创建
  • ViewModel创建后随着Lifecycle一起一直存在,直到Lifecycle消失,即Activity/Fragement销毁(销毁时,Lifecycle消失)。
  • ViewModel完全依赖于Lifecycle的,所以ViewModel具有生命周期感知能力
    来看谷歌爸爸贴出来的一张图


    生命周期

3.2、Fragment共享数据

我们经常在一个Activity写多个Fragment,他们之间经常切换共享数据。使用ViewModel就很方便。

public class MyViewModel extends ViewModel {
    MutableLiveData<String> title;

    public MutableLiveData<String> getTitle() {
        return title;
    }
}

    public class MasterFragment extends Fragment {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ViewModelProvider.Factory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(getActivity().getApplication());
            ViewModelProvider viewModelProvider = new ViewModelProvider(getActivity(), factory);
            viewModel = viewModelProvider.get(MyViewModel.class);
        }
    }

    public class DetailFragment extends Fragment {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ViewModelProvider.Factory factory = ViewModelProvider.AndroidViewModelFactory.getInstance(getActivity().getApplication());
            ViewModelProvider viewModelProvider = new ViewModelProvider(getActivity(), factory);
            viewModel = viewModelProvider.get(MyViewModel.class);
        }
    }
  • 在Activity范围下,ViewModel拿到的对象实例是同一个。所以他们很方便的就能共享数据,而不需要我们去操作Activity
  • 各个Fragment之间没有影响,一个关闭不会影响另一个
  • 我们拿到数据也快,开启一个新的Fragment,ViewModel没有被销毁,拿到实例就可显示

3.3、应用场景

  • ViewModel + LiveData 管理UI数据
  • Fragment之间共享数据
  • VIewModel + LiveData+Room 数据加载器
  • ViewModel + LiveData + DataBinding 绑定数据自动更新
    分别说下这几个控件
    Lifecycle设计来独立生命周期。ViewModel和LiveData都依赖于Lifecycle,具有生命周期感知能力(本文ViewModel的体现就是一直存在直到Lifecycle销毁)。依赖它就可以不必担心生命周期存在否,UI是否显示,Activity是否在后台等逻辑。
    ViewModel它思想就是独立管理数据。把这个数据管理任务和UI分离
    LiveData存在的目的是,既然ViewModel可以很好的拆分UI和数据了,那么就需要LiveData的来优雅的更新UI,采用LiveData去更新UI,省去很多代码和逻辑耦合。
    DataBinding布局引用数据源,简化数据和UI之间的操作
    Room设计来轻量化管理sqlite,让我们更好的操作。强大且稳健。并且Room扩展返回LiveData或者Rxjava中的Publisher和Flowable或者cursor等

四、写在最后

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

推荐阅读更多精彩内容