建设厅网站贵州人事考试信息网提供手机网站制作公司

news/2025/10/2 5:21:18/文章来源:
建设厅网站贵州人事考试信息网,提供手机网站制作公司,深圳百度代理,课件ppt免费下载目录 一、LiveData的基本使用1. 使用方式一2. 使用方式二3. 使用方式三 二、LiveData 去除黏性数据的方法1. 去除黏性的Java版本2. 去除黏性的Kotlin版本 一、LiveData的基本使用 1. 使用方式一 MyLiveData.kt package com.example.mylivedata.simple1import androidx.lifec… 目录 一、LiveData的基本使用1. 使用方式一2. 使用方式二3. 使用方式三 二、LiveData 去除黏性数据的方法1. 去除黏性的Java版本2. 去除黏性的Kotlin版本 一、LiveData的基本使用 1. 使用方式一 MyLiveData.kt package com.example.mylivedata.simple1import androidx.lifecycle.MutableLiveDataobject MyLiveData { // 单例// 懒加载val info : MutableLiveDataString by lazy { MutableLiveDataString() } }MainActivity.kt package com.example.mylivedata.simple1import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.TextView import androidx.lifecycle.Observer import com.example.mylivedata.R import kotlin.concurrent.threadclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val textView : TextView findViewById(R.id.tv_textView)// TODO 1.观察者 环节MyLiveData.info.observe(this, ObserverString { t -textView.text t // 更新UI})// 完整写法 new Observer 重写onChange方法MyLiveData.info.observe(this, object : ObserverString {override fun onChanged(t: String?) {textView.text t // 更新UI}})// TODO 2.触发数据改变 环节MyLiveData.info.value default // setValue 主线程thread {Thread.sleep(3000)MyLiveData.info.postValue(三秒钟后修改了哦) // postValue 子线程}thread {Thread.sleep(6000)MyLiveData.info.postValue(六秒钟后修改了哦) // postValue 子线程}} }2. 使用方式二 MyLiveData.kt package com.example.mylivedata.simple2import androidx.lifecycle.MutableLiveDataobject MyLiveData { // 单例// 这里为data的MutableLiveData 懒加载初始化懒加载用到时才加载val data : MutableLiveDataString by lazy { MutableLiveDataString()}init {// data.value dafault // 违背 在子线程setValue(SetValue在主线程中执行)data.postValue(test) // 子线程 执行postValue(postValue在子线程中执行)}}MyServer.kt package com.example.mylivedata.simple2import android.app.Service import android.content.Intent import android.os.IBinder import android.util.Log import kotlin.concurrent.thread// 模拟后台推送 class MyServer : Service() {override fun onBind(intent: Intent?): IBinder? nulloverride fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {thread {for ( x in 1 .. 1000) {Log.d(MyServer, 服务器给你推送消息(叮咚声响),消息内容是:${x})MyLiveData.data.postValue(服务器给你推送消息啦消息内容是:${x})Thread.sleep(2000) // 2秒推送一次}}return super.onStartCommand(intent, flags, startId)} }MainActivity2.kt package com.example.mylivedata.simple2import android.content.Intent import android.os.Bundle import android.util.Log import android.widget.Button import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.example.mylivedata.R import java.util.*class MainActivity2 : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main2)// 启动服务val button findViewByIdButton(R.id.bt)button.setOnClickListener {startService(Intent(this, MyServer::class.java))Toast.makeText(this, 推送服务器启动成功, Toast.LENGTH_SHORT).show()}// 观察者 界面可见的情况下才能做事情MyLiveData.data.observe(this, androidx.lifecycle.Observer {Log.d(MyServer, 界面可见说明用户在查看列表界面啦更新信息列表UI界面:${it})Toast.makeText(this, 更新消息列表UI界面成功:${it}, Toast.LENGTH_SHORT).show()})} }3. 使用方式三 该方式使用的是黏性数据 MyLiveData.kt package com.example.mylivedata.simple3import androidx.lifecycle.MutableLiveDataobject MyLiveData {// 这里的data的MutableLiveData 懒加载初始化懒加载用到时才加载val data : MutableLiveDataString by lazy { MutableLiveDataString() }}MainActivity3.kt package com.example.mylivedata.simple3import android.content.Intent import android.os.Bundle import android.widget.Button import androidx.appcompat.app.AppCompatActivity import com.example.mylivedata.Rclass MainActivity3 : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main3)val button findViewByIdButton(R.id.button)button.setOnClickListener {MyLiveData.data.value 我就是我不一样的烟火startActivity(Intent(this, MainActivity4::class.java))}} }MainActivity4.kt package com.example.mylivedata.simple3import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Observer import com.example.mylivedata.Rclass MainActivity4 : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main4)// 后观察数据居然能够收到 前面修改的数据这就是 数据黏性/*MyLiveData.data.observe(this, Observer {Toast.makeText(this, 观察者数据变化:${it}, Toast.LENGTH_SHORT).show()})*/MyLiveData.data.observe(this, object : ObserverString {override fun onChanged(t: String?) {Toast.makeText(thisMainActivity4, 观察者数据变化:$t, Toast.LENGTH_SHORT).show()}})// 此观察者 和handler没有区别一股脑的执行极端的情况可以用// 但是需要手动考虑释放工作//MyLiveData.data.observeForever { }}override fun onDestroy() {super.onDestroy()// 手动释放//MyLiveData.data.removeObserver()} }二、LiveData 去除黏性数据的方法 1. 去除黏性的Java版本 OkLiveDataBusJava.java package com.example.mylivedata.simple4;import androidx.annotation.NonNull; import androidx.arch.core.internal.SafeIterableMap; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.Observer;import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map;/*** 单例模式 去掉粘性事件 Java版本*/ public class OkLiveDataBusJava {// 存放订阅者private MapString, BusMutableLiveDataObject bus;private static OkLiveDataBusJava liveDataBus new OkLiveDataBusJava();private OkLiveDataBusJava() {bus new HashMap();}public static OkLiveDataBusJava getInstance() {return liveDataBus;}// 注册订阅者public synchronized T BusMutableLiveDataT with(String key, ClassT type) {if (bus.containsKey(key)) {bus.put(key, new BusMutableLiveData());}return (BusMutableLiveDataT) bus.get(key);}public static class BusMutableLiveDataT extends MutableLiveDataT {Overridepublic void observe(NonNull LifecycleOwner owner, NonNull Observer? super T observer) {super.observe(owner, observer); // 启用系统的功能不写就破坏了hook(observer);}private void hook(Observer? super T observer) {try {// TODO 1.得到mLastVersion// 获取到LiveData类中的mObservers对象ClassLiveData liveDataClass LiveData.class;Field mObserversField liveDataClass.getDeclaredField(mObservers);mObserversField.setAccessible(true);// 获取到这个成员变量的对象Object mObserversObject mObserversField.get(this);// 得到map对象的class对象 private SafeIterableMapObserver? super T, ObserverWrapper mObservers new SafeIterableMap();Class? mObserversClass mObserversObject.getClass();// 获取到mObservers对象的get方法Method get mObserversClass.getDeclaredMethod(get, Object.class);get.setAccessible(true);// 执行get方法Object invokeEntry get.invoke(mObserversObject, observer);// 取到entry中的valueObject observerWrapper null;if (invokeEntry ! null invokeEntry instanceof Map.Entry) {observerWrapper ((Map.Entry) invokeEntry).getValue();}if (observerWrapper null) {throw new NullPointerException(observerWrapper is null);}// 得到observerWrapper的类对象// observerWrapper.getClass() 获取的是LifecycleBoundObserver类对象// observerWrapper类是LifecycleBoundObserver类的父类Class? supperClass observerWrapper.getClass().getSuperclass();Field mLastVersion supperClass.getDeclaredField(mLastVersion);mLastVersion.setAccessible(true);// TODO 2.得到mVersionField mVersion liveDataClass.getDeclaredField(mVersion);mVersion.setAccessible(true);// TODO 3.mLastVersion mVersionObject mVersionValue mVersion.get(this);mLastVersion.set(observerWrapper, mVersionValue);} catch (Exception e) {e.printStackTrace();}}} } 2. 去除黏性的Kotlin版本 OKLiveDataBusKT.kt package com.example.mylivedata.simple4import android.util.Log import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer import java.lang.NullPointerException import java.lang.reflect.Field import java.lang.reflect.Method/*** 单例模式 去掉黏性事件有关闭黏性的开关KT版本*/ object OKLiveDataBusKT {// 存放订阅者private val bus : MutableMapString, BusMutableLiveDataAny by lazy { HashMapString, BusMutableLiveDataAny() }// 暴露一个函数给外界注册订阅者关系fun T with(key : String, type : ClassT, isStack : Boolean true) : BusMutableLiveDataT {if (!bus.containsKey(key)) {bus[key] BusMutableLiveData(isStack)}return bus[key] as BusMutableLiveDataT}class BusMutableLiveDataT private constructor() : MutableLiveDataT() {var isStack : Boolean false// 次构造constructor(isStack: Boolean) : this() {this.isStack isStack}override fun observe(owner: LifecycleOwner, observer: Observerin T) {super.observe(owner, observer)if (!isStack) {hook(observer)Log.d(abc, Kotlin版本 不启用黏性)} else {Log.d(abc, Kotlin版本 启用黏性)}}private fun hook(observer: Observerin T) {// TODO 1.得到mLastVersion// 获取到LiveData的类中的mObservers对象val liveDataClass LiveData::class.javaval mObserversField liveDataClass.getDeclaredField(mObservers)mObserversField.isAccessible true // 私有修饰可以访问// 获取到这个成员变量的对象 Kotlin Any Java Objectval mObserversObject : Any mObserversField.get(this)// 得到map对象的class对象 private SafeIterableMapObserver? super T, ObserverWrapper mObservers new SafeIterableMap();val mObserversClass : Class* mObserversObject.javaClass// 获取到mObservers对象的get方法 protected EntryK, V get(K k)val get : Method mObserversClass.getDeclaredMethod(get, Any::class.java)get.isAccessible true // 私有修饰也可以访问// 执行get方法val invokeEntry : Any get.invoke(mObserversObject, observer)// 取到entry中的valuevar observerWrapper : Any? nullif (invokeEntry ! null invokeEntry is Map.Entry*, *) {observerWrapper invokeEntry.value}if (observerWrapper null) {throw NullPointerException(observerWrapper is null)}// 得到observerWrapper的类对象val supperClass : Class* observerWrapper.javaClass.superclassval mLastVersion : Field supperClass.getDeclaredField(mLastVersion)mLastVersion.isAccessible true// TODO 2.得到mVersionval mVersion : Field liveDataClass.getDeclaredField(mVersion)mVersion.isAccessible true// TODO 3.mLastVersion mVersionval mVersionValue mVersion.get(this)mLastVersion.set(observerWrapper, mVersionValue)}} }MainActivity.kt package com.example.mylivedata.simple4import android.content.Intent import android.os.Bundle import android.widget.Button import androidx.appcompat.app.AppCompatActivity import com.example.mylivedata.Rclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// LiveData发生消息通知所有的观察者数据变化了// KT版本 旧数据 黏性数据OKLiveDataBusKT.with(data1, String::class.java).value liveData kotlin数据// Java版本OkLiveDataBusJava.getInstance().with(data2, String::class.java).value livaData java数据// 点击事件跳转到下一个Activityval button findViewByIdButton(R.id.button)button.setOnClickListener {startActivity(Intent(this, MainActivity2::class.java))}} }MainActivity2.kt package com.example.mylivedata.simple4import android.os.Bundle import android.util.Log import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Observer import com.example.mylivedata.R import kotlin.concurrent.threadclass MainActivity2 : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main2)// Kotlin版本订阅观察者OKLiveDataBusKT.with(data1, String::class.java).observe(this, Observer(){Toast.makeText(this, Kotlin版本的观察者:${it}, Toast.LENGTH_SHORT).show()Log.d(abc, Kotlin版本的观察者:${it})})// Java版本订阅观察者Java是模拟剔除黏性的OkLiveDataBusJava.getInstance().with(data2, String::class.java).observe(this, Observer() {Toast.makeText(this, Java版本的观察者:${it}, Toast.LENGTH_SHORT).show()Log.d(abc, Java版本的观察者:${it})})thread {Thread.sleep(2000)OKLiveDataBusKT.with(data1, String::class.java).postValue(2222)}thread {Thread.sleep(4000)OkLiveDataBusJava.getInstance().with(data2, String::class.java).postValue(4444)}} }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/924572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何查看网站开发源码宁波seo软件

$ clip < ~/.ssh/id_rsa.pubbash: /c/Users/UsersName/.ssh/id_rsa.pub: No such file or directoryStep 1、检查本机现有的SSH密钥检查~/.ssh看看是否有名为d_rsa.pub和id_dsa.pub的2个文件。如果你什么都没得到这些文件&#xff0c;转到 步骤2 ;否则&#xff0c;请跳到 …

进一步加强区门户网站建设管理办法网站建设 套餐

Google Breakpad是什么&#xff1f; 一个开源的多平台崩溃报告系统。 Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块&#xff0c;它支持Windows&#xff0c;Linux和Mac和Solaris。由于他本身跨平台&#xff0c;所以很大程度上减少了我们在平台移植时的工作&#…

网站建设最新资讯上海网络营销上海网络推广

文章目录 由浅入深学习TapableTapable是什么Tapable的Hook分类同步和异步的 使用Sync*同步类型钩子基本使用bailLoopWaterfall Async*异步类型钩子ParallelSeries 由浅入深学习Tapable webpack有两个非常重要的类&#xff1a;Compiler和Compilation。他们通过注入插件的方式&a…

电信100m光纤做网站常州做上市公司律所

ctfshow的杂项签到题&#xff0c;下载压缩包之后里面有图片。 直接将图片用010editor打开&#xff0c;检索ctfshow可以看到答案。

网站主持人制作网站建设策划书总结

工业镜头是图像采集系统的重要光学设备。它的作用是将目标物体的像成在相机的感光面上。 一、工业镜头原理 镜头是对光线进行调制和变换&#xff0c;使目标能够成像到相机的感光芯片上。将不同折射率的硝材加工成高精度的曲面&#xff0c;再把这些曲面进行组合后设计成能够满…

郑州注册网站江东怎样优化seo

南邮杯CTF 文件包含 题目地址&#xff1a;asdf 点击后利用file函数对show.php进行文件利用 使用伪协议php://filter/readconvert.base64-encode/resourceindex.php访问index.php文件 base64解码后得到flag [极客大挑战 2019]Secret File 题目地址&#xff1a;BUUCTF在线评测 …

网站建设 保密wordpress文章权限

nuget 是.Net平台上的包管理器, 对于包的发布(打包 package)和消费(下载依赖管理)都有很好的支持, 本文仅仅关注消费端, nuget项目依赖定义格式 新版 nuget 和VS 2019 都推荐项目依赖采用 PackageReference 格式, 这种格式的依赖声明是放到 .csproj 项目文件中的, 之前是使用…

网站建设登录界面设计步骤百度网站登录入口

前言现在对于Docker容器的隔离性都有所了解了&#xff0c;但对容器IP地址的分配、容器间的访问等还是有点小疑问&#xff0c;如果容器的IP由于新启动导致变动&#xff0c;那又怎么才能保证原有业务不会被影响&#xff0c;这就和网络有挂钩了&#xff0c;接下来就大概说说。正文…

wordpress软件站模板网页设计是做什么

引言 JSON&#xff0c;作为一种轻量级的数据交换格式&#xff0c;因其易于人阅读和编写&#xff0c;同时也易于机器解析和生成&#xff0c;而被广泛应用于网络通信和配置文件中。在Java中&#xff0c;有两个强大的工具帮助咱们处理JSON数据——Jackson和Gson。这两个库各有千秋…

郑州金水区建设局网站如何打开用wordpress

类型 说明 后缀或前缀 示例 sbyte 有符号 8 位整数 y 86y 0b00000101y byte 无符号 8 位自然数 uy 86uy 0b00000101uy int16 有符号 16 位整数 s 86s uint16 无符号 16 位自然数 us 86us int int32 有符号 32 位整数 l none。 86 86l uint uint32 无符号 32 位自然数 u 或 ul 8…

网站优化是怎么做的网络推广方案下拉管家xiala11

一、需求 在执行 mvn clean package -Dmaven.test.skiptrue 后&#xff0c;生成的 jar 包带有自定义系统时间。 二、实现 方法一&#xff1a;使用自带属性&#xff08;不推荐&#xff09; 使用系统时间戳&#xff0c;但有一个问题&#xff0c;就是默认使用 UTC0 的时区。举例…

网站推广广告包装设计十大网站

前言&#xff1a;MySQL有很多的可视化管理工具&#xff0c;比如“mysql-workbench”和“sequel-pro-”。 现在我写MySQL的终端命令操作的文章&#xff0c;是想强化一下自己对于MySQL的理解&#xff0c;总会比使用图形化的理解透彻&#xff0c;因为我本来就比较喜欢写代码。同时…

德赞网站建设网站制作企业网站的设计公司

文章目录1. 题目2. 解题1. 题目 给定一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意一个 nums[i] &#xff0c;删除它并获得 nums[i] 的点数。之后&#xff0c;你必须删除每个等于 nums[i] - 1 或 nums[i] 1 的元素。 开始你拥有…

怎么做提卡密网站广东省造价工程信息网

作者&#xff1a;lesleyfootprint.network 数据源&#xff1a;Token Sector Dashboard ChatGPT 的热潮点燃了 AI 领域&#xff0c;AI 与区块链技术的融合成为市场关注的焦点。因为区块链的一个显著特征是它能够在链上安全地存储大量数据&#xff0c;这与 AI 模型对数据的密集…

佛山中小企业网站制作wordpress首页自定义广告位

出于MVVM学习的需要&#xff0c;复习下匿名方法和Lambda表达式&#xff0c;因为之前用的也比较少&#xff0c;所以用的也不是很熟练&#xff0c;Baidu下相关的知识&#xff0c;写了这个Demo&#xff0c;目标是用简单的方法展示这个怎么用。 这里偏重的和LINQ中的Lambda表达式 …

网站建设服务器介绍图片网站的类型

背景 1 工作需要&#xff0c;需要修改一个java的程序逻辑&#xff0c;之前都是用的frida修改的&#xff0c;但是现在的工作场景&#xff0c;重视效率&#xff0c;所以frida这种重工具被pass了&#xff0c;只能重新选其他工具&#xff0c;初始的时候是想用java本身的一些修改工…

双语网站建设报价营销与运营的区别

友情提示&#xff1a;全文13000多文字&#xff0c;预计阅读时间10-15分钟Spring Cloud Eureka作为常用的服务注册中心&#xff0c;我们有必要去了解其内在实现机制&#xff0c;这样出现问题的时候我们可以快速去定位问题。当我们搭建好Eureka Server服务注册中心并启动后&#…

广州达美网站建设wordpress黑帽插件

某项目中&#xff0c;我要给别人封装一个深度学习算法的SDK接口&#xff0c;运行在RK3588平台上&#xff0c;然后客户给我的交叉编译工具链是 然后我用他们给我的交叉编译工具链报下面的错误&#xff1a; aarch64-buildroot-linux-gnu-gcc --version /data/chw/aarch64/bin/cca…

免费建站网页无需登陆广西新狐网络科技有限公司

在主要课程学完并确定论文题目后&#xff0c;研究生撰写论文的时间为一年半至两年。(一)论文选题的要求1. 选题必须有一定的理论意义或应用价值论文选题必须对国民经济建设或在学术上有一定的价值。2&#xff0e;国内外研究动态论文选题时&#xff0c;学生必须掌握与该课题有关…

怎样做网站公司的销售如何修改百度上面的门店号码

转&#xff1a; js判断数组里是否有重复元素的方法 https://blog.csdn.net/longzhoufeng/article/details/78840974第一种方法&#xff1a;但是下面的这种方法数字字符串类似相同&#xff0c;返回的还是真&#xff0c;有点不靠谱&#xff0c;如果是其它的字符是可以的 var ary1…