骚年都2020年了你还在用EventBus吗?jetpack之liveData

95 篇文章 0 订阅

在说源码时简单说下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♪(・ω・)ノ

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值