Android 用LiveDataBus替代RxBus、EvenBus

最近使用Rxbus发现升级到33版本的时候,会出现报黄色,看着很不舒服。然后就想着找找替换的方案。查找了蛮多资料。发现版本大部分都是大同小异。就如下的链接的三个版本。第一个就是简单实现类型。也是之前Rxbus早期的原型。再就是后面我用来改良的版本。

但是跟之前用的Rxbus又有点不一样。因为原先都是习惯了的懒人写法。所以就用当前的类名(XXX.getClass().getSimpleName())来替代需要一直定义的订阅键值。好吧,话不多说。直接上源码:

/**
 * LiveDataBus 数据交互帮助类
 *
 * 

* Created by * Change */ public class LiveDataBus { public static final Map> bus = new HashMap<>(); public static synchronized MutableLiveData toObservable(Class type){ String key = type.getSimpleName(); if (!bus.containsKey(key)){ bus.put(key, new BusMutableLiveData<>()); } return (MutableLiveData) bus.get(key); } public static void post(Object type){ String key = type.getClass().getSimpleName(); if (!bus.containsKey(key)){ bus.put(key, new BusMutableLiveData<>()); } Objects.requireNonNull(bus.get(key)).postValue(type); } private static class ObserverWrapper implements Observer { private Observer observer; public ObserverWrapper(Observer observer) { this.observer = observer; } @Override public void onChanged(@Nullable 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 ("androidx.lifecycle.LiveData".equals(element.getClassName()) && "observeForever".equals(element.getMethodName())) { return true; } } } return false; } } public static class BusMutableLiveData extends MutableLiveData { private Map observerMap = new HashMap<>(); @Override public void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) { super.observe(owner, observer); try { hook(observer); } catch (Exception e) { e.printStackTrace(); } } @Override public void observeForever(@NonNull Observer observer) { if (!observerMap.containsKey(observer)) { observerMap.put(observer, new ObserverWrapper(observer)); } super.observeForever(Objects.requireNonNull(observerMap.get(observer))); } @Override public void removeObserver(@NonNull Observer observer) { Observer realObserver = null; if (observerMap.containsKey(observer)) { realObserver = observerMap.remove(observer); } else { realObserver = observer; } super.removeObserver(realObserver); } private void hook(@NonNull Observer observer) throws Exception { //get wrapper's version Class 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 version Field fieldVersion = classLiveData.getDeclaredField("mVersion"); fieldVersion.setAccessible(true); Object objectVersion = fieldVersion.get(this); //set wrapper's version fieldLastVersion.set(objectWrapper, objectVersion); } } }

使用方法:

注册订阅:

LiveDataBus.toObservable(TokenEvent.class).observeForever(result -> {// 做退出登录的操作
            exit();
            LoginActivity.startActivity(this);
        });

发送消息:

LiveDataBus.post(new TokenEvent());

总结:

实践是检验真理的唯一标准----古人说的话没错。最后,希望能帮助到需要的人。有问题请指正,谢谢!下面是查阅的相关资料。有需要的可以去看看。原理什么的可以去了解一下下。我就不去复述照搬了。大家互相学习吧!共勉

参考的链接如下:

Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus本文提供了一个新的消息总线框架LiveDataBus,利用它不仅可以实现消息总线功能,而且对于订阅者,他们不需要关心何时取消订阅,极大减少了因为忘记取消订阅造成的内存泄漏风险。https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651748475&idx=4&sn=8feb14dd49ce79726ecf12eb6c243740&chksm=bd12a1368a652820df7c556182d3494d84ae38d4aee4e84c48c227aa5083ebf2b1a0150cf1b5&scene=38#wechat_redirectLiveDataBus替代RxBus、EventBus - 简书https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651748475&idx=4&sn=8feb14dd49ce7...https://www.jianshu.com/p/7b68f9f07821Android 使用 LiveData 实现 EventBus - 简书绪论 本文是学习了大佬的文章后,自己去动手实践后写的一篇学习笔记。大佬的文章写得比较好,我自己去写未必描述得那么清楚,所以本文很多地方都直接引用了大佬的文章。 项目源码:h...https://www.jianshu.com/p/f9f86bd928a1

你可能感兴趣的:(android,LiveDataBus,替代RxBus,EvenBus)