在说源码时简单说下liveData使用

//在app的build添加依赖

//使用liveData
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'

1创建一个类实现ViewModel,定义一个方法获取liveData

/**
 * liveData是个抽象类 ,可以理解为一个能感知生命周期的仓库
 * mutableLIveData 是他的实现类
 */
public class MyViewModel extends ViewModel {
    //注意使用static修饰 源码直接通过类获取
    private static MutableLiveData<List<Bean>> mutableLiveData;

//获取仓库
    public MutableLiveData<List<Bean>> getLiveData() {
        if (mutableLiveData == null) {
            mutableLiveData = new MutableLiveData<>();
        }
        return mutableLiveData;
    }

}

2定义一个bean类

public class Bean {
    String name;

public Bean(String name) {
        this.name = name;
    }

public String getName() {
        return name;
    }

public void setName(String name) {
        this.name = name;
    }
}

3在activity中使用

订阅消息代码

  //调用系统API获取 viewModel
        MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
        liveData = myViewModel.getLiveData();
        //订阅消息
        liveData.observe(this, new Observer<List<Bean>>() {
            @Override
            public void onChanged(List<Bean> beans) {
                //数据接收
                Toast.makeText(LiveDataActivity.this, "" + beans.get(0).getName(), Toast.LENGTH_SHORT).show();
            }
        });

发送消息代码

 list.add(new Bean("张三"));
 list.add(new Bean("李四"));
liveData.setValue(list);

使用很简单,那我们分析下liveData是源码时如何实现的呢?

liveData这么好,那么我们看看他的源码的核心逻辑

我们从获取ViewModel代码入口  ViewModelProviders.of(this).get(MyViewModel.class);

点击of()方法,代码很简单,获取activity的application,创建ViewModelProviders对象

点击get()方法    第一个参数:是固定自定义协议+viewModel实现类的getCanonicalName

第二个参数:viewModel实现类

点击内部的get方法,代码很简单,先从一个ViewModelStore获取ViewModel,如果有就直接返回,没有就创建,再保存到ViewmodelStore,再返回。

我们看看工厂的create()方法是如何创建ViewModel的,看到下图源码就一目了然,使用反射创建的

我们看看ViewModelStore代码,就是个HashMap保存的ViewModel封装类,源码看多,有很多类似的使用map复用的类似代码。

现在我们看看MutablLiveData的setValue()方法,点击进去,没有什么代码,那应该调用父类的setValue方法,

点击到父类的setValue方法,调用了dispatchValue方法

我们看看dispatchValue做了些什么,又调用了considerNotify()方法,在这个方法最后行代码,他实现了接口Observer的onChanged()方法

最终还是通过接口回调方式,把数据给到订阅者。

这是有人问,那liveData是如何感知感知什么周期的呢?我们点击liveData的obser方法,会发现是使用Lifecycle实现生命周期的监听。

如果对Lifecycle不了解的可以看我这篇文章https://blog.csdn.net/qq_36237165/article/details/102544785

liveData源码介绍到这,下面是我们基于liveData封装的一个库,可以实现一行代码发送消息,一行代码订阅消息,还能感知生命周期,从数据根源上防止内存泄漏。

https://blog.csdn.net/qq_36237165/article/details/104878044

喜欢的点星Thanks♪(・ω・)ノ

骚年都2020年了你还在用EventBus吗?jetpack之liveData相关推荐

  1. 都2020年了,还在迷信啤酒与尿布!数据分析的真相是……

    一提人工智能大数据,必有人提啤酒与尿布,有意思的是,都2020年了,还有人信这个老掉牙的都市传说.今天我们系统讲解一下.  1  站在背后的关联规则 支持啤酒与尿布故事的,是关联规则算法.注意:关联规 ...

  2. cdialog创建后马上隐藏_都2020了,你还没用上这些Windows的“隐藏神技能”?

    如今,电脑系统 的天下都被Windows和macOS给占领了,那么它们之间的较量自然是不少.关于它们谁更好用的话题从来就没断过,也从来没有什么标准答案,只能说是萝卜青菜各有所爱吧.可每次看到那些说Wi ...

  3. 后端开发需要学什么_都2020年了,还在纠结学什么语言?| 后端篇

    几个礼拜前,一个学弟问我: "Ray,我打算之后要找工作了,不过现在自己没有特别深入的语言,最近想找一门好好学一下,你觉得学什么语言好呀?" 我表示:"这个要看你求职方向 ...

  4. winre drv分区干嘛用的_都2020年了,还在给硬盘分区?看完你就知道有没有必要了...

    电脑硬盘,到底该不该分区? 很多人买了新电脑或者在电脑中安装了SSD硬盘之后,第一个步骤就是:开机-给硬盘分区. 但是,大家有没有考虑过,硬盘是否真的需要分区呢?这不最近有人就在程序员社区V2EX上提 ...

  5. css字体样式代码大全_这都2020年了,还没了解CSS?

    对于新人来说想要了解css,就要从最基本的入手了解,讲真的学习css入门很简单,学习html和css短时间后你就可以制作一个网页,深入的去学习的话,就会很难.他就是从简--深--深--简的一个过程,如 ...

  6. 安卓源代码_都2020年了,还有人以为安卓系统是谷歌的?

    阅读本文前,请您先点击上面的蓝色字体"杨观世界",再点击"关注",这样您就可以免费收到最新内容了.每天都有分享,完全是免费订阅,请放心关注. 4月8日晚,华为结 ...

  7. 都2020年了,别再迷信啤酒与尿布!数据分析的真相在这

    一提人工智能大数据,必有人提啤酒与尿布,有意思的是,都2020年了,还有人信这个老掉牙的都市传说.今天我们系统讲解一下. 一.站在背后的关联规则 支持啤酒与尿布故事的,是关联规则算法.注意:关联规则算 ...

  8. 都2020年了,数据分析的真相究竟是什么?

    作者:接地气的陈老师 来源:接地气学堂 一提人工智能大数据,必有人提啤酒与尿布,有意思的是,都2020年了,还有人信这个老掉牙的都市传说.今天我们系统讲解一下.  1 站在背后的关联规则 支持啤酒与尿 ...

  9. 2020 年,你还在使用 Java 中的 SimpleDateFormat 吗?

    作者 | 阿文 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 今天我和大家一起聊一聊SimpleDateFormat ,这都2020年了,怎么还在用SimpleDateFormat ? ...

最新文章

  1. java中定义score方法_elasticsearch 自定义 script score JavaAPI查询详解
  2. python3 numpy. ndarray 与 list 互转方法
  3. SHE PWM的simulink仿真谐波分析
  4. escape、encodeURI 、encodeURIComponent 编码与解码
  5. Bash shell的内建命令:type
  6. 获取treeview中当前鼠标所指的节点treenode 。
  7. 【生活资讯】5款好用的生活学习类APP
  8. Exchange2010 owa 访问 http 500 内部服务器错误
  9. HDU 1151 Air Raid
  10. maven项目建立pom xml报无法解析org apache maven plugins maven resource
  11. (四)、Redis删除策略---Redis设计与实现读书笔记
  12. 其于js的五笔输入法!
  13. 计算机考研专业课除了408,2020贵州大学计算机专业课改考408
  14. 【IOS自动化解放双手系列一】unity3D导出xcode 工程并配置各种权限
  15. 小红书赞助和广告有什么区别,小红书赞助和广告一样吗?
  16. 消息推送----微信小程序,公众号
  17. MNL——多项Logit模型学习笔记(三)二项Logit模型、Gumble分布以及Logistic分布
  18. SSM拦截器和过滤器结合使用-实现登录拦截操作
  19. JS点击进行展开和折叠的功能代码
  20. 此更新不适用于您的计算机 kb4012212,2017 年 3 月发布的适用于 Windows 7 SP1 和 Windows Server 2008 R2 SP1 的纯安全质量更新...

热门文章

  1. 重磅 | GitHub私有仓库从此免费,微软要赢开发者的心
  2. 高通android逆向分析,浅谈Android高通(Qualcomm)和联发科(MTK)平台
  3. asp毕业设计——基于asp+access的航班在线定票系统设计与实现(毕业论文+程序源码)——航班在线定票系统
  4. 基于ZigBee的物联网毕业论文设计
  5. Android APK 反编译的基本工具和步骤
  6. [JAVA]文件和IO
  7. C语言学习(十八)大程序
  8. python一元二次方程表达式_Python实现求解一元二次方程的方法示例
  9. 微视网媒:万亿城配的变局者,罗戈网专访绿色慧联总经理杨东
  10. cad中怎么随意移动图形_AutoCAD2017怎么移动图形 整体拖动图纸教程