安卓LiveDataBus使用记录

server/2024/12/20 20:00:37/

创建三个文件

BusMutableLiveData.kt
package com.donews.common.livedatabus;import androidx.annotation.NonNull;
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;/*** 应用模块: liveData* <p>* 类描述: 扩展liveData hook源码拦截实现非粘性事件* <p>** 作者: created by honeylife<br>* 日期:2020-02-07*/
public class BusMutableLiveData<T> extends MutableLiveData<T> {private Map<Observer,Observer> observerMap = new HashMap<>();@Overridepublic void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {super.observe(owner, observer);try {hook(observer);}catch (Exception e){e.printStackTrace();}}@Overridepublic void observeForever(@NonNull Observer<? super T> observer) {if (!observerMap.containsKey(observer)){observerMap.put(observer,new ObserverWrapper(observer));}super.observeForever(observerMap.get(observer));}@Overridepublic void removeObserver(@NonNull Observer<? super T> observer) {Observer realObserver = null;if (observerMap.containsKey(observer)){realObserver = observerMap.remove(observer);}else {realObserver = observer;}super.removeObserver(realObserver);}/*** hook源码实现,拦截订阅之前的事件* @param observer observer* */private void hook(Observer<? super T> observer) throws Exception {//get wrapper's versionClass<LiveData> classLiveData = LiveData.class;Field fieldObservers = classLiveData.getDeclaredField("mObservers");fieldObservers.setAccessible(true);Object objectObservers = fieldObservers.get(this);Class<?> classObservers = objectObservers.getClass();Method methodGet = classObservers.getDeclaredMethod("get", Object.class);methodGet.setAccessible(true);Object objectWrapperEntry = methodGet.invoke(objectObservers, observer);Object objectWrapper = null;if (objectWrapperEntry instanceof Map.Entry) {objectWrapper = ((Map.Entry) objectWrapperEntry).getValue();}if (objectWrapper == null) {throw new NullPointerException("Wrapper can not be bull!");}Class<?> classObserverWrapper = objectWrapper.getClass().getSuperclass();Field fieldLastVersion = classObserverWrapper.getDeclaredField("mLastVersion");fieldLastVersion.setAccessible(true);//get livedata's versionField fieldVersion = classLiveData.getDeclaredField("mVersion");fieldVersion.setAccessible(true);Object objectVersion = fieldVersion.get(this);//set wrapper's versionfieldLastVersion.set(objectWrapper, objectVersion);}
}
ObserverWrapper.kt
package com.donews.common.livedatabus;import androidx.lifecycle.Observer;/*** 应用模块: liveData* <p>* 类描述: Observer 包装类* <p>** 作者: created by honeylife<br>* 日期:2020-02-07*/
public class ObserverWrapper<T> implements Observer<T> {private Observer<T> observer;public ObserverWrapper(Observer<T> observer) {this.observer = observer;}@Overridepublic void onChanged(T t) {if (observer != null){if (isCallOnObserve()){return;}observer.onChanged(t);}}private boolean isCallOnObserve() {StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();if (stackTrace != null && stackTrace.length > 0) {for (StackTraceElement element : stackTrace) {if ("android.arch.lifecycle.LiveData".equals(element.getClassName()) &&"observeForever".equals(element.getMethodName())) {return true;}}}return false;}
}
LiveDataBus.kt
package com.donews.common.livedatabus;import androidx.lifecycle.MutableLiveData;import java.util.HashMap;
import java.util.Map;/*** 应用模块: liveData* <p>* 类描述: 基于liveData的事件总线 1.关联activity / fragment 的生命周期 自动识别活动状态触发更新 2.可以发送两种事件* 普通事件 & 粘性事件** <p>** 作者: created by honeylife<br>* 日期:2020-02-07*/
public class LiveDataBus
{/*** 粘性事件集合*/private final Map<String, MutableLiveData> stickyBus;/*** 普通事件结合*/private final Map<String, BusMutableLiveData> bus;private LiveDataBus(){stickyBus = new HashMap<>();bus = new HashMap<>();}public static LiveDataBus getInstance() {return singleHolder.SINGLE_BUS;}private static class singleHolder {private static final LiveDataBus SINGLE_BUS = new LiveDataBus();}public MutableLiveData<Object> with(String key) {return with(key, Object.class);}public <T> MutableLiveData<T> with(String key, Class<T> type) {if (!bus.containsKey(key)) {bus.put(key, new BusMutableLiveData<T>());}return  bus.get(key);}public MutableLiveData<Object> withSticky(String key) {return withSticky(key, Object.class);}public <T> MutableLiveData<T> withSticky(String key, Class<T> type) {if (!stickyBus.containsKey(key)) {stickyBus.put(key, new MutableLiveData<T>());}return  stickyBus.get(key);}}

具体使用:

//发送数据
LiveDataBus.getInstance().with("key").setValue("需要发送的数据");//接收数据LiveDataBus.getInstance().with("key", String::class.java).observe(requireActivity()) {//it就是接收到的数据val result = it
}


http://www.ppmy.cn/server/151772.html

相关文章

力扣-图论-12【算法学习day.62】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

题目 3010: 奇偶数之和

题目 3010: 奇偶数之和 时间限制: 2s 内存限制: 192MB 提交: 3298 解决: 2005 题目描述 利用循环&#xff0c;分别输出1∼n之间的所有奇数的和、偶数的和。 输入格式 输入n 输出格式 输出为一行&#xff0c;两个数(用一个空格隔开)&#xff0c;偶数之和与奇数之和。 样例输入 1…

python实现视频切分图片

python脚本 import os import subprocess from tkinter import * import tkinter.messagebox import tkinter as tkdef videoCut(video_path,fps):# 获取当前工作路径</

快速解决oracle 11g中exp无法导出空表的问题

在一些生产系统中&#xff0c;有些时候我们为了进行oracle数据库部分数据的备份和迁移&#xff0c;会使用exp进行数据的导出。但在实际导出的时候&#xff0c;我们发现导出的时候&#xff0c;发现很多空表未进行导出。今天我们给出一个快速解决该问题的办法。 一、问题复现 我…

系列5:基于Centos-8.6 Kubernetes master节点允许运行pod节点

每日禅语 不识本心&#xff0c;内心不定&#xff0c;心就会随物转&#xff1b;倘若能了知自己的心&#xff0c;动静如一&#xff0c;那么万象万物都可以随心而转。净心才能入定&#xff0c;从而摆脱外物的牵绊&#xff1b;心不因外物而动才能真正认清自己&#xff0c;遇到顺境不…

Android 获取屏幕物理尺寸

注&#xff1a;编译 sdk 需要使用 30 因为引入了 WindowMetrics、uild.VERSION_CODES.R 新 sdk 才存在的类和属性 某些场景处理 view &#xff0c;对 view 显示的位置要求比较精确&#xff0c;通常我们使用context.getResources().getDisplayMetrics().widthPixels 获取到的宽、…

淘系商品评论json数据示例参考,API接口系列

以下是一个淘系商品评论的JSON数据示例&#xff0c;以及如何使用相关API接口的简要说明&#xff1a; JSON数据示例 {"status": "success","message": "评论数据获取成功","data": {"product_id": "1234567…

设计模式-读书笔记

确认好&#xff1a; 模式名称 问题&#xff1a;在何时使用模式&#xff0c;包含设计中存在的问题以及问题存在的原因 解决方案&#xff1a;设计模式的组成部分&#xff0c;以及这些组成部分之间的相互关系&#xff0c;各自的职责和协作方式&#xff0c;用uml类图和核心代码描…