在说源码时简单说下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. 斯坦福CS231 BP后向传播
  2. 华人首次!清华姚班助理教授张焕晨获得SIGMOD Jim Gray博士论文奖!
  3. 专家谈计算机体系架构研究获“图灵奖”
  4. 使用IntelliJ IDEA开发SpringMVC网站(一)开发环境
  5. mpp新增一个字段_如何快速新增百万测试数据?
  6. x86中的页表结构和页表项格式
  7. 数据处理踩过的坑(不断更新):
  8. 20种小技巧,玩转Google Colab
  9. 从Python 2切换到Python 3:您需要了解的内容
  10. MySQL高级-索引
  11. UnityWebReqest和WWW,请求web数据打包到Android手机上,报错 Unknown error记录
  12. java 访问iis异常_在IIS中部署应用程序时无法访问Active Directory
  13. 计算机程序设计在线课程,最新章节测试答案2020学堂在线计算机程序设计基础(先修课)...
  14. win10升级win11教程(包含TPM2.0的设置以及OfflineInsiderEnroll工具)
  15. PreparedStatement enum
  16. VC++将位图中保存的图像灰化(附源码)
  17. 一、回首向来萧瑟处,也无风雨也无晴
  18. 2022年的ISTQB,你考了没?
  19. Linux的基础指令
  20. (半成品)Excel文件按要求导出至模板excel中(含配套数据)

热门文章

  1. jQuery 参考手册 - Ajax
  2. 泛在操作系统的国内外主要产品
  3. 学业、结婚、买房、工作.....即将20岁,焦虑扑面而来
  4. xgboost原理分析以及实践
  5. scapy构造IP分片包
  6. 请收藏:流固耦合经验总结(一)
  7. 如何用60万轻松搞定在北京的住房问题攻略
  8. Excel 科研作图
  9. 名悦集团:买新车注意做到这几个不要
  10. 性能测试简单分析和调优