Android JetPack~ LiveData (一) 介绍与使用
一般情况下LiveData都是搭配这ViewModel使用,这里先介绍一下LiveData,再结合ViewModel使用
- Android数据绑定技术一,企业级开发
- Android数据绑定技术二,企业级开发
- Android JetPack~ DataBinding(数据绑定)(一) 集成与使用
- Android JetPack~ LiveData (一) 介绍与使用
- Android JetPack~ ViewModel (一) 介绍与使用
目录
1、什么是LiveData
- LiveData是一个观察者模式的数据实体类,它可以在所有注册观察者回调里查看数据是否有更新。
- LiveData它能感知绑定者的生命周期(如Activity,Fragment),不会发生内存泄露,因为它只会给活跃状态的activity回调,我们在使用的时候通常都会在回调里去更新UI。
- 从非活跃状态变为活跃状态时,回调方法会立即接收到最新的数据
- 当设备切横竖屏,会重建Activity生命周期,它也会立即接收最新的可用数据。
- 不可变,setValue和postValue不支持外部使用(protected修饰)。下面代码讲解
- 抽象类,无法直接new
2、什么是MutableLiveData
- MutableLiveData的父类是LiveData
- 用法和LiveData类似,也是在注册观察者回调里查看更新数据
- 可变,setValue和postValue支持外部使用(public修饰)
- 普通类,可以直接new
3、LiveData与MutableLiveData区别
- LiveData在实体类里可以通知指定某个字段的数据更新.(下面会贴代码)
- MutableLiveData则是完全是整个实体类或者数据类型变化后才通知.不会细节到某个字段
4、LiveData的使用
public class UserBean extends LiveData<UserBean> {
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
postValue(this);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
postValue(this);
}
}
public void setAge(int age) {
this.age = age;
// postValue(this);
// 如果不写的话,单独调用setAge后,在外getAge获取不到值,因为回调没有被触发,
// 如果name写了postValue(this),更新了name也会连着age更新,因为传的是this
}
4.1ViewModel新建
public class MyViewModel extends ViewModel {
public UserBean mUserBean = new UserBean();
public UserBean getUserBean() {
return mUserBean;
}
}
4.2Activity中添加回调方法
//通过ViewModeProvider 把activity和ViewModel绑定起来。
myViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MyViewModel.class);
observer = new Observer<UserBean>() {
@Override
public void onChanged(UserBean userBean) {
Log.e("activity",userBean.getName());
mBinding.textShow.setText("name="+userBean.getName()+" ,, age="+userBean.getAge()+"");
}
};
//绑定观察者
myViewModel.getUserBean().observe(this, observer);
a = 0;
mBinding.btnUpdata.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myViewModel.getUserBean().setName("大王"+a);
myViewModel.getUserBean().setAge(a++);
}
});
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
4.3有绑定就会有解绑
myViewModel.getUserBean().removeObserver(observer);
5、MutableLiveData的使用
public class MyViewModel extends ViewModel {
private MutableLiveData<String> mStr;
public MutableLiveData<String> getmStr() {
return mStr;
}
public void setmStr(String s) {
if(mStr==null){
mStr = new MutableLiveData<>();
}
mStr.setValue(s);
}
}
5.1在activity中使用
myViewModel.getmStr().observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
}
});
6、LiveData和MutableLiveData的可变与不可变
@SuppressWarnings("WeakerAccess")
public class MutableLiveData<T> extends LiveData<T> {
@Override
public void postValue(T value) {
super.postValue(value);
}
@Override
public void setValue(T value) {
super.setValue(value);
}
}

public class MyViewModel extends ViewModel {
private MutableLiveData<String> mStr= new MutableLiveData<>();
public LiveData<String> getmStr() {
return mStr;
}
//在外面只能通过这种方式去更新
public void setmStr(String s) {
mStr.setValue(s);
}
}

7、其他方法
postValue()
postValue的特性如下:
1.此方法可以在其他线程中调用
2.如果在主线程执行发布的任务之前多次调用此方法,则仅将分配最后一个值。
3.如果同时调用 .postValue()和.setValue(),结果是post的值覆盖set值。
setValue()
setValue()的特性如下:
1.此方法只能在主线程里调用
getValue()
返回当前值。 注意,在后台线程上调用此方法并不能保证将接收到最新的值。
removeObserver(@NonNull final Observer<? super T> observer)
移除指定的观察者
removeObservers(@NonNull final LifecycleOwner owner)
移除当前Activity或者Fragment的全部观察者
hasActiveObservers()
如果此LiveData具有活动(Activity或者Fragment在前台,当前屏幕显示)的观察者,则返回true。其实如果这个数据的观察者在最前台就返回true,否则false。
hasObservers()
如果此LiveData具有观察者,则返回true。
observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer)
设置此LiveData数据当前activity或者Fragment的观察者,会给此activity或者Fragment在前台时回调数据。
observeForever(@NonNull Observer<? super T> observer)
1.设置永远观察者,永远不会被自动删除。您需要手动调用removeObserver(Observer)以停止观察此LiveData,
2.设置后此LiveData,一直处于活动状态,不管是否在前台哪里都会获得回调。
总结:
Android JetPack~ LiveData (一) 介绍与使用的更多相关文章
- Android Jetpack 组建介绍(一)——Lifecycler
转自带你领略Android Jetpack组件的魅力 Android Jetpack 对于任何一个产品来说,我们开发中都会面对哪些问题?如:产品交互.用户体验.代码结构.数据获取.数据存储.网络优化. ...
- Android Jetpack 组建介绍(二)——Lifecycler
参考Android Jetpack架构组件之 Lifecycle(源码篇) 源码分析 关于Lifecycle的使用考上一篇文章Android Jetpack框架之 Lifecycles(使用篇),从使 ...
- Android Jetpack 架构组件最佳实践之“网抑云”APP
背景 近几年,Android 相关的新技术层出不穷.往往这个技术还没学完,下一个新技术又出来了.很多人都是一脸黑人问号? 不少开发者甚至开始哀嚎:"求求你们别再创造新技术了,我们学不动了!& ...
- 学习Android Jetpack? 入门教程和进阶实战这里全都有!
前言 2018年谷歌I/O,Jetpack横空出世,官方介绍如下: Jetpack 是一套库.工具和指南,可帮助开发者更轻松地编写优质应用.这些组件可帮助您遵循最佳做法.让您摆脱编写样板代码的工作并简 ...
- Android官方架构组件介绍之LifeCycle(一)
Android官方架构组件介绍之LifeCycle 下面是官方提供的Android App开发的架构图: 从上图可以看到一些关键字:ViewModel,LiveData,Room等.其实看了上面视频的 ...
- Android Jetpack - 使用 Navigation 管理页面跳转
在今年的 IO 大会上,发布了一套叫 Android Jetpack 的程序库.Android Jetpack 里的组件大部分我们都接触过了,其中也有一些全新的组件,其中一个就是 Navigation ...
- 带你了解Android Jetpack
1.Jetpack主要特性有以下三点: 1.加速开发组件可单独使用,也可以协同工作,当使用kotlin语言特性时,可以提高效率. 2.消除样板代码Android Jetpack可管理繁琐的Activi ...
- Android Jetpack组件
带你领略Android Jetpack组件的魅力 Android新框架jetpack的内容讲解:Room.WorkManager.LifeCycles.LiveData.ViewModel.DataB ...
- Android Jetpack从入门到精通(深度好文,值得收藏)
前言 即学即用Android Jetpack系列Blog的目的是通过学习Android Jetpack完成一个简单的Demo,本文是即学即用Android Jetpack系列Blog的第一篇. 记得去 ...
- 【Android Jetpack高手日志】DataBinding 从入门到精通
前言 DataBinding 数据绑定库是 Android Jetpack 的一部分,借助该库可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源.我个人觉得,使用 DataBin ...
随机推荐
- Windows自带管理工具
exe类notepad 记事本 control 控制面板 mstsc 远程桌面连接explorer 资源管理器 taskmgr 任务管理器resmon 资源监视器 perfmon 性能监视器reged ...
- 单一JVM同步锁实现
同步锁实现 一.背景 在并发场景下,需要单一线程或限定并发数操作某些逻辑,这时候就需要用到一个锁来保证线程安全. 二.思路 使用ConcurrentHashMap实现,但只支持同一个jvm下的线程(暂 ...
- 全都会!预测蛋白质标注!创建讲义!解释数学公式!最懂科学的智能NLP模型Galactica尝鲜 ⛵
作者:韩信子@ShowMeAI 机器学习实战系列:https://www.showmeai.tech/tutorials/41 深度学习实战系列:https://www.showmeai.tech/t ...
- 浅谈 Java 和 Python 的反射
反射这个词我一直没搞懂,也不知道为什么需要反射,也不知道反射到底做了什么.所见所闻逐渐丰富之后,开始有点儿懂了. 先不管反射这个词是什么意思.Java 里面有反射,Python 里面也有反射,但是不太 ...
- ArcObjects SDK开发 013 MapFrame
1.如何获取MapFrame 打开一个Mxd文件,可能包含一个或多个Map,每个Map都会放到一个MapFrame中,加载到PageLayout上.我们可以通过PageLayout继承的IGraphi ...
- 如何通过C#合并Word文档?
合并Word文档可以快速地将多份编辑好的文档合在一起,避免复制粘贴时遗漏内容,以及耗费不必要的时间,同时,也方便了人们阅读或者对其进行再次修改.例如,在我们进行团队作业的时候,每个人都会有不同的分工, ...
- MySQL基础知识(二)-超详细 Linux安装MySQL5.7完整版教程及遇到的坑
1.简介 我们经常会在Linux上安装MySQL数据库,但是安装的时候总是会这里错,那里错,不顺利,今天整理了一下安装流程,连续安装来了两遍,没有遇到什么大错误,基本上十分钟左右可以搞定,教程如下.写 ...
- python @property的介绍与使用
python @property的介绍与使用 python的@property是python的一种装饰器,是用来修饰方法的. 作用: 我们可以使用@property装饰器来创建只读属性,@proper ...
- List排序(降序)
一.添加一个比较器 点击查看代码 import java.util.Comparator; /** * @Classname ComparatorResultType * @Description 排 ...
- 我的RHCA认证之旅
云方向的RHCA架构师认证 想更深入研究Linux.对Linux有一定兴趣,我在2022.12.27这一天通过了RHCA认证 课程介绍 以下是我在众多RHCA的专家课程中,选择的五门 cl210 (R ...