LiveData简介及使用-什么是LiveData的粘性事件(数据倒灌)?

news/2024/11/24 13:27:39/
  • 建议先了解《Lifecycle原理、源码解析》

  • LiveData是一种具有生命周期感知能力的可观察数据持有类

  • LiveData可以保证屏幕上的显示内容和数据一直保持同步

  • 特点:

  • 1.LiveData了解UI界面的状态,如果activity不在屏幕上显示,livedata不会触发没必要的界面更新,如果activity已经被销毁,会自动清空与observer的连接,意外的调用就不会发生

  • 2.LiveData是一个LifecycleOwner,他可以直接感知activity或fragment的生命周期

使用

  • 项目中livedata一般都存放在ViewModel中,以保证app配置变更时,数据不会丢失
  • 使用注意:
    setValue只能在主线程运行
    postValue只能在子线程中运行

方式一

  • 定义一个viewmodel保存名字
package com.example.livedatademo;import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;public class NameViewModel extends ViewModel {private MutableLiveData<String> currentName;public MutableLiveData<String> getCurrentName(){if(currentName==null){currentName=new MutableLiveData<>();}return currentName;}
}
  • 在activity里面监听名字变化然后刷新数据
package com.example.livedatademo;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;public class NameActivity extends AppCompatActivity {private NameViewModel model;private TextView nameTextView;private Button btn;private int i=0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_name);nameTextView=findViewById(R.id.tvText);btn=findViewById(R.id.btn);//需要一个观察者来观察数据Observer observer=new Observer<String>(){@Overridepublic void onChanged(String s) {nameTextView.setText(s);}};//获取到viewmodelmodel= ViewModelProviders.of(this).get(NameViewModel.class);//取出livedata完成订阅model.getCurrentName().observe(this,observer);btn.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v) {String anotherName="Gavin"+(i++);model.getCurrentName().setValue(anotherName);}});}
}

方式二

  • 定义一个总线LiveDataBus,统一处理
package com.example.livedatademo.databus;import androidx.lifecycle.MutableLiveData;import java.util.HashMap;
import java.util.Map;public class LiveDataBus {//存放订阅者private Map<String, MutableLiveData<Object>> bus;private static LiveDataBus liveDataBus = new LiveDataBus();private LiveDataBus() {bus = new HashMap();}public static LiveDataBus getInstance() {return liveDataBus;}//注册订阅者public synchronized <T> MutableLiveData<T> with(String key, Class<T> type) {if(!bus.containsKey(key)){bus.put(key,new MutableLiveData<Object>());}return (MutableLiveData<T>)bus.get(key);}
}
  • 在TestLiveDataBusActivity里面监听数据变化
package com.example.livedatademo;import android.content.Intent;
import android.os.Bundle;
import android.view.View;import androidx.appcompat.app.AppCompatActivity;import com.example.livedatademo.databus.LiveDataBus;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void click(View view) {if (view.getId() == R.id.btn) {Intent intent = new Intent(this, NameActivity.class);startActivity(intent);} else if (view.getId() == R.id.btn2) {Intent intent = new Intent(this, TestLiveDataBusActivity.class);startActivity(intent);new Thread(){@Overridepublic void run() {for (int i = 0; i < 10; i++) {//发送消息LiveDataBus.getInstance().with("data", String.class).postValue("Gavin");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}}}
  • TestLiveDataBusActivity
package com.example.livedatademo;import android.os.Bundle;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;import com.example.livedatademo.databus.LiveDataBus;public class TestLiveDataBusActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_livedatabus);LiveDataBus.getInstance().with("data", String.class).observe(this, new Observer<String>() {@Overridepublic void onChanged(String s) {if(s!=null)Toast.makeText(TestLiveDataBusActivity.this, s, Toast.LENGTH_SHORT).show();}});}
}

什么是LiveData的粘性事件(数据倒灌)?

  • 在上面的使用方式二中,让R.id.btn2的点击事件里面先更新livedata的数据,然后再创建TestLiveDataBusActivity,会发现TestLiveDataBusActivity还是收到了旧数据通知(还没创建activity前的数据)
  • 修改后的代码如下
Intent intent = new Intent(this, TestLiveDataBusActivity.class);
//先更新数据
new Thread(){@Overridepublic void run() {for (int i = 0; i < 10; i++) {//发送消息LiveDataBus.getInstance().with("data", String.class).postValue("Gavin");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}}
}.start();
//再创建activity
startActivity(intent);

http://www.ppmy.cn/news/1036939.html

相关文章

群晖安装 frpc

群晖安装 frpc 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 写该文章之前&#xff0c; 我尝试过使用 “任务计划” 设置开机启动 frpc&#xff0c; 但是失败了。 最后尝试使用 docker 开机启动 frpc 才成功&#xff0c; 因此本文主要介绍使用 docker …

黑客入侵:福特汽车Sync3车机存在漏洞,黑客入侵可抹除系统数据

据福特汽车公告&#xff0c;他们发现部分2021年至2022年车型的Sync3车机存在Wi-Fi漏洞&#xff0c;该漏洞可能被黑客利用来入侵并抹除车机内的系统数据。这一漏洞源于福特车系中采用的WL18xx MCP驱动程序的内存缓冲区溢位漏洞&#xff0c;其漏洞编号为CVE-2023-29468。 这一发现…

cpu和io的关系

在说io的五中模型之前,先说说Io把文件从哪里移到了哪里 自己的理解: 根据工作或者遇到的业务. 文件不可能存在缓存或在内存中,因为缓存和内存不能永久性储存东西, 文件需要被永久性储存.因此文件都存在电脑的硬盘里, 或者存在云服务器的它们的硬盘里. 我们io文件, 第一…

Java 工具类之JSON key根据ASCII排序

Java按键值字典序排列 参数按照KEY值进行字典序排序(按照KEY值的ASCII码从小到大),并用&作为各参数之间的分隔符将参数拼接成字符串。这里用到了SortedMap&#xff0c;复制以下代码开箱即用~ /*** getSortedString 对参数按照Key进行ASCII排序* param jsonObject 请求参数…

【Java基础】Java对象的生命周期

【Java基础】Java对象的生命周期 一、概述 一个类通过编译器将一个Java文件编译为Class字节码文件&#xff0c;然后通过JVM中的解释器编译成不同操作系统的机器码。虽然操作系统不同&#xff0c;但是基于解释器的虚拟机是相同的。java类的生命周期就是指一个class文件加载到类…

C++——函数重载及底层原理

函数重载的定义 函数重载&#xff1a; 是函数的一种特殊情况&#xff0c;C允许在同一作用域重声明几个功能类似的同名函数&#xff0c;这些同名函数的形参列表&#xff08;参数个数或者类型&#xff0c;类型的顺序&#xff09;不同&#xff0c;常用来处理实现功能类似数据结构…

JavaScript读取文件夹和文件、输出文件内容到控制台、showDirectoryPicker、getFile、FileReader、readAsText

文章目录 读取文件夹并输出某个文件内容读取文件及输出内容 读取文件夹并输出某个文件内容 效果图 html <button id"idFolder" class"fs_30 cursor_pointer">选择文件夹</button>JavaScript idFolder.onclick async function () {try {let …

每日一题——二叉树的镜像

题目 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。 数据范围&#xff1a;二叉树的节点数 0≤n≤1000 &#xff0c; 二叉树每个节点的值 0≤val≤1000 要求&#xff1a; 空间复杂度 O(n) 。本题也有原地操作&#xff0c;即空间复杂度 O(1) 的解法&#xff0c;时间…