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 ...
随机推荐
- Go语言核心36讲02
你好,我是郝林,今天我分享的主题是,学习专栏的正确姿势. 到了这里,专栏的全部内容已经都推送到你的面前了.如果你已经同步学习完了,那么我要给你点一个大大的赞! 还没有看完的同学也不要着急,因为推送的速 ...
- jdk线程池ThreadPoolExecutor优雅停止原理解析(自己动手实现线程池)(二)
jdk线程池工作原理解析(二) 本篇博客是jdk线程池ThreadPoolExecutor工作原理解析系列博客的第二篇,在第一篇博客中从源码层面分析了ThreadPoolExecutor在RUNNIN ...
- UED Landing 页 - 定时抓取掘金文章
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:琉易 https://liuxianyu.cn 本次分享基 ...
- Day20:继承详解
继承的理解 继承:对类进行抽象化:也就是将存在的类构造成新的类: 比如说学生是一个类,老师是一个类,那么我们可以将学生类和老师类收纳进人这个类:那么学生和老师则为子类(派生类).人为父类(基类):子类 ...
- SpringCloud Alibaba(三) - GateWay网关
1.基本环境搭建 1.1 依赖 <!-- Gatway 网关会和springMvc冲突,不能添加web依赖 --> <dependency> <groupId>or ...
- 【Shell案例】【awk每行执行一次】11、转置文件的内容
描述写一个 bash脚本来转置文本文件nowcoder.txt中的文件内容. 为了简单起见,你可以假设:你可以假设每行列数相同,并且每个字段由空格分隔 示例:假设 nowcoder.txt 内容如下: ...
- 【每日一题】【第n个 n-->0】19./NC53 【删除】链表的倒数第 N 个结点-211123/220127
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 答案: import java.util.*; /* * public class ListNode { * int val; * ...
- MySQL可视化软件(Navicat)部署与使用
目录 一:可视化软件(Navicat) 1.什么是可视化软件? 2.什么是Navicat? 二:部署MySQL(Navicat) 1.Navicat连接本地MySQL 2.连接MySQL,输入密码,在 ...
- ob-myfreemp3
网站 aHR0cDovL3Rvb2wubGl1bWluZ3llLmNuL211c2ljLw== 打开之后随便搜一个歌手的名字或歌曲(这里搜林俊杰) m/api/search,可以看到数据全在这里 全 ...
- LeetCode HOT 100:子集(简单易懂的回溯)
题目:78. 子集 题目描述: 给你一个整数数组,数组中元素互不相同.返回数组中所有可能的子集,且子集不能重复! 什么是子集?举个例子:原数组[1, 2, 3],[].[1].[1, 2].[1, 3 ...