EventBus

EventBus的小tips

牧云@^-^@ 提交于 2020-02-03 18:42:05
1. EventBus的线程模式 2.黏性事件 3. 配置混淆规则 . . . . 0.EventBus的简介 一个Android事件发布/订阅轻量级框架, 功能:通过解耦发布者和订阅者简化Android事件传递 [2] EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。 特点:代码简洁,是一种发布订阅设计模式(观察者设计模式)。 . . 1. EventBus的线程模式 ThreadMode 因为安卓对线程的严格限制,EventBus也相应的进行的不同的线程控制。通过指定线程模式,我们可以控制订阅回调函数运行于哪一个线程。 线程模式主要有: POSTING :在哪个线程发布就在哪个行程执行 MAIN :在主线程执行,如果订阅方回调事件较为耗时,则发布方的后续指令会被阻塞。 MAIN_ORDERED :发布后会立即执行后续的指令,不会被订阅方回调事件阻塞。 BACKGROUND :在后台线程执行(非UI线程),如果发布方在非UI线程,则订阅方也会在相同的线程,如果发布方在UI线程,则订阅方会新建一个线程,并在该线程中执行。 ASYNC :不管事件在哪个线程发布,都会在独立的新开的线程中执行。可以执行耗时操作 2.黏性事件

Vue造轮子-Tabs测试(上)

强颜欢笑 提交于 2020-01-28 22:22:08
1. 点击出现下划线的问题 // tabs-item.vue methods: { xxx() { this.eventBus.$emit('update:selected', this.name, this) } } // tabs.vue mounted(){ this.eventBus.$emit('update:selected', this.selected) } // tabs-head created(){ this.eventBus.$on('update:selected', (item, vm) => { console.log(item) console.log(vm) // 初始化的时候打印出的值为undefined }) } // 为了解决初始化打印出为undefined的问题 // tabs.vue 通过两层循环解决找到item mounted(){ this.$children.forEach((vm)=>{ if(vm.$options.name === 'GuluTabsHead'){ // 找儿子 vm.$children.forEach((childVm)=>{ // 找孙子 if(childVm.$options.name === 'GuluTabsItem' && childVm.name === this.selected){ this

Android EventBus3.0源码解析

久未见 提交于 2020-01-26 15:02:14
前言 上一篇 我们讲到了EventBus3.0的用法,这一篇我们来讲一下EventBus3.0的源码以及它的利与弊。 1.构造函数 当我们要调用 EventBus 的功能时,比如注册或者发送事件,总会调用 EventBus.getDefault() 来获取 EventBus 实例: public static EventBus getDefault() { if (defaultInstance == null) { synchronized (EventBus.class) { if (defaultInstance == null) { defaultInstance = new EventBus(); } } } return defaultInstance; } 很明显这是一个单例模式,采用了双重检查模式 (DCL),不了解的同学可以查看 设计模式(二)单例模式的七种写法 这篇文章。 接下来看看 new EventBus() 做了什么: public EventBus() { this(DEFAULT_BUILDER); } 这里 DEFAULT_BUILDER 是默认的 EventBusBuilder ,用来构造 EventBus : private static final EventBusBuilder DEFAULT_BUILDER = new

EventBus源码详解

≯℡__Kan透↙ 提交于 2020-01-20 18:48:32
我们在使用EventBus的时候,首先要注册EventBus: EventBus.getDefault().register(this); 那么我们就从这段代码作为入口,一步一步探索EventBus的秘密! 我们先看看getDefault()这个方法: static volatile EventBus defaultInstance; public static EventBus getDefault() { if (defaultInstance == null) { synchronized (EventBus.class) { if (defaultInstance == null) { defaultInstance = new EventBus(); } } } return defaultInstance; } 很明显,采用了单例的设计模式。 进入register()方法查看: public void register(Object subscriber) { //通过反射,拿到这个类 Class<?> subscriberClass = subscriber.getClass(); //通过这个类,拿到所有subcriber注解的方法,并返回到一个集合里 List<SubscriberMethod> subscriberMethods =

Kotlin-Android开发之透彻理解EventBus的MAIN、POSTING、BACKGROUND、ASYNC,4种线程模式

匆匆过客 提交于 2020-01-17 03:55:35
前言:很多人写项目都会用到EventBus,可以说解决了很多麻烦的事情,区区几行代码,就能解决四大组件的通信,异步线程和主线程之间的通信。这次主要介绍EventBus的4种线程模式:ThreadMode.MAIN(常用)、ThreadMode.POSTING、ThreadMode.BACKGROUND、ThreadMode.ASYNC EventBus的简单用法 1.添加eventbus3.1.1依赖 implementation 'org.greenrobot:eventbus:3.1.1' 2.在MainActivy中接收SecondActivity中EventBus发送的信息(注意:在onCreate()里面注册,在onDestory()中注销) class MainActivity : AppCompatActivity() { private lateinit var button: Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) EventBus.getDefault().register(this) //注册EventBus button =

分布式事务,EventBus 解决方案:CAP【中文文档】

可紊 提交于 2020-01-14 03:00:47
原文: 分布式事务,EventBus 解决方案:CAP【中文文档】 最新文档地址: https://github.com/dotnetcore/CAP/wiki 前言 很多同学想对CAP的机制以及用法等想有一个详细的了解,所以花了将近两周时间写了这份中文的CAP文档,对 CAP 还不知道的同学可以先看一下 这篇文章 。 本文档为 CAP 文献(Wiki),本文献同时提供中文和英文版本,英文版本目前还在翻译中,会放到Github Wiki 中。 目录 前言 1、Getting Started 1.1 介绍 1.2 应用场景 1.3 Quick Start 2、API接口 2.1 发布/发送 2.1.1 事务 2.2 订阅/消费 2.2.1 例外情况 3、配置 3.1 Cap Options 3.2 RabbitMQ Options 3.3 Kafka Options 3.4 SqlServer Options 3.5 MySql Options 4、设计原理 4.1 动机 4.2 持久化 4.3 通讯数据流 4.4 一致性 5、实现 5.1 消息表 5.2 消息格式 5.3 EventBus 5.4 重试 6、分布式事务 6.1 异步确保 7、FAQ 1、Getting Started 1.1 介绍 CAP 是一个遵循 .NET Standard 标准库的C#库

Vue中组件间的通信技巧

百般思念 提交于 2020-01-11 14:39:10
在Vue中经常会遇到一些比较复杂的业务场景,需要组件之间隔代通信或者是兄弟组件之间相互通信,这种情况下,我们一般选用EventBus方式解决组件间的通信问题,具体实现如下: // utils/EventBus.js import Vue from 'vue'; // 直接导出一个Vue实例,使用Vue示例的$emit、$on、$once、$off的功能进行组件间的通信,由于所有的组件都引入同一实例,故相互间的通信是可以被彼此捕获的 export default new Vue(); // main.js import Vue from "vue"; import App from "./App.vue"; import bus from "./utils/EventBus"; Vue.prototype.$bus = bus; new Vue({ render: h => h(App) }).$mount("#app"); // a.vue <template> <div class="container"> </div> </template> <script> export default { name: "test", data(){ return { userInfo:{} } }, created(){ this.$bus.$emit("aCreated",

Vertx简介

北慕城南 提交于 2020-01-11 02:31:29
今天看了一篇很不错的关于Vertx的简介,转载下。 原文链接:http://www.csdn.net/article/2015-12-21/2826533?utm_source=tuicool&utm_medium=referral Vert.x的由来 Vert.x诞生于2011年,当时叫node.x,不过后来因为某些原因改名位Vert.x。经过三年多的发展,现在已经到了3.2版本,社区也越来越活跃,在最新的官网Vertx.io上,作者用一句话介绍了它,JVM上的Reative开发套件。Vert.x目前是见过最功能最强大,第三方库依赖最少的Java框架,它只依赖Netty4以及Jacskon,另外如果你需要建立分布式的Vert.x则再依赖HazelCast这个分布式框架,注意Vert.x3必须基于Java8。由于基于JVM,所以Vert.x可以用其他语言来实现你的业务。默认官方维护的语言是Groovy,JavaScript以及 JRuby。 Vert.x是一个异步无阻塞的网络框架,其参照物是node.js。基本上node.js能干的事情,Vert.x都能干。Vert.x利用Netty4的EventLoop来做单线程的事件循环,所以跑在Vert.x上的业务不能做CPU密集型的运算,这样会导致整个线程被阻塞。 图1是一个简单的通过Vert.x起HTTP服务的例子(Java实现)

guava的eventBus和disruptor比较

你。 提交于 2020-01-10 05:49:00
EventBus: 基于观察者模式实现的, 本文基于同步模式来操作 ;这里只介绍下几个常用操作的代码实现: register:注册观察者实现:主要就是以把观察者观察的类key,同类观察者的set集合为value构成一个ConcurrenHashMap 代码如下: private final ConcurrentMap<Class<?>, CopyOnWriteArraySet<Subscriber>> subscribers = Maps.newConcurrentMap(); 这里有两步加锁:map分段锁,copyOnWriteArraySet读写锁; EventBus.post(Object):发送事件实现:根据事件的class找subscribers中的观察者,通过反射执行所有观察者的@Subscribe注解注释的方法; 代码如下: public void post(Object event) { Iterator<Subscriber> eventSubscribers = subscribers.getSubscribers(event); if (eventSubscribers.hasNext()) { dispatcher.dispatch(event, eventSubscribers); } else if (!(event instanceof

vue 组件传值踩坑日记 2

戏子无情 提交于 2020-01-09 22:38:12
这里介绍一下适合兄弟组件和父子,祖孙组件之间的传值方式-事件总线,废话不多说,直接上代码 总结:说白了这东西就是一种发布订阅的模式,发数据的一方用$emit发,各个接听方用$on接受对应key的事件,on的时候,就选择在DOM挂在完毕以后进行监听,通过这样的事件去修改数据,完成传递工作,感兴趣的同学可以吧这个代码拿下去直接调试运行一下看看 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> </head> <body> <div id="app"> <com1></com1> </div> <template id="com1"> <div> <h1>我是父组件</h1> <span>我接受孙组件的数据:{{msg}}</span> <input type="text" ref="txtMsg" v-model="msg" /> <com2></com2> <com3></com3> </div> <