Observer

用LiveDataBus替代RxBus、EventBus——Android消息总线的演进之路

人走茶凉 提交于 2019-11-29 13:09:15
背景 对于Android系统来说,消息传递是最基本的组件,每一个App内的不同页面,不同组件都在进行消息传递。消息传递既可以用于Android四大组件之间的通信,也可用于异步线程和主线程之间的通信。对于Android开发者来说,经常使用的消息传递方式有很多种,从最早使用的Handler、BroadcastReceiver、接口回调,到近几年流行的通信总线类框架EventBus、RxBus。Android消息传递框架,总在不断的演进之中。 从EventBus说起 EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化Android事件传递。EventBus可以代替Android传统的Intent、Handler、Broadcast或接口回调,在Fragment、Activity、Service线程之间传递数据,执行方法。 EventBus最大的特点就是:简洁、解耦。在没有EventBus之前我们通常用广播来实现监听,或者自定义接口函数回调,有的场景我们也可以直接用Intent携带简单数据,或者在线程之间通过Handler处理消息传递。但无论是广播还是Handler机制远远不能满足我们高效的开发。EventBus简化了应用程序内各组件间、组件与后台线程间的通信。EventBus一经推出,便受到广大开发者的推崇。 现在看来

ZooKeeper系列之(十二):服务端实现机制

血红的双手。 提交于 2019-11-29 08:10:22
服务端有3种运行方式:leader,follower,observer。leader是领导者,一个ZooKeeper集群同一时刻最多只能有一个leader。follower是跟随者,可以有多个跟随者。Observer是观察者,也可以有多个观察者。 集群刚开始的时候没有leader,这时所有的follower会发起选举过程,选举出唯一一个leader。只有选举出了leader之后集群才能正式工作,被选举出的机器的角色则从follower转换成leader,其余的机器则将自己的leader地址更改为新选举出的leader地址。observer不参与选举过程。 正常的集群对外提供统一服务接口,不管leader、follower、还是observer都可以提供对外服务,对于客户端来说他们是没有区别的。 服务端功能可以分成两大类:选举相关的和服务相关的,我们先看服务相关的。 服务相关的专门用于响应ZooKeeper客户端的请求,类名称为ZooKeeperServer。它又分成3个子类,名称为:LeaderZooKeeperServer,FollowerZooKeeperServer,ObserverZooKeeperServer。顾名思义它们分别在Leader,Follower,Observer时使用。 当LeaderZooKeeperServer收到客户端写事务请求时

ZooKeeper系统之(四):跟随者工作模式

拈花ヽ惹草 提交于 2019-11-29 08:01:52
当ZooKeeper集群启动之后,需要完成leader和follower之间的数据同步。 首先leader和observer有一个共同的父类learner,里面定义了一些公共方法。集群正常运行后会有一个leader和多个follower(这里observer就不单独说了,和follower的行为是类似的)。 1、 注册过程 follower在提供服务给客户端之前必须完成注册到leader的动作。 注册分为以下3个主要步骤: a) 调用connectToLeader方法连接到Leader。 b) 调用registerWithLeader方法注册到Leader,交换各自的sid、zxid和Epoch等信息,Leader以此决定事务同步的方式。 c) 调用SyncWithLeader跟Leader进行事务数据同步,处理SNAP/DIFF/TRUNC包。 这3个方法都定义在父类Learner类中。下面我们以Follower作为例子说明注册到Leader的完整流程。 2、connectToLeader connectToLeader方法功能较简单,创建Socket连接到Leader。该方法定义在Follower的父类Learner中。它加了重试机制,具体的代码这里就不给出了。 最多可以尝试5次连接

JS源码分析│简易mvvm库的设计实现

谁都会走 提交于 2019-11-29 04:34:30
作者:刀哥(朱建) 前言:mvvm模式即model-view-viewmodel模式简称,单项/双向数据绑定的实现,让前端开发者们从繁杂的dom事件中解脱出来,很方便的处理数据和ui之间的联动。本文将从vue的双向数据绑定入手,剖析mvvm库设计的核心代码与思路。 1、需求整理与分析 需求: 数据一旦改变则更新数据对应的ui ui改变则触发事件改变ui对应的数据 分析: 通过dom节点的指令获取刷新函数,用来刷新指定的ui。 实现一个桥接的方法,让刷新函数和需要的数据关联起来。 监听数据变化,数据改变后通过桥接方法调用刷新函数。 ui改变触发对应的dom事件在改变特定的数据。 2、实现思路 实现observer,重新定义data,为data上每个属性增加setter,getter以监听数据的变化。 实现compile,扫描模版template,提取每个dom节点中的指令信息。 实现directive,通过指令信息是实例化对应的directive实例,不同类型的directive拥有不同的刷新函数update。 实现watcher,让observer的属性监听函数与directive的update函数做一一对应,以实现数据变化后更新视图。 3、模块划分 MVVM目前划分为observer,compile,directive,watcher四个模块。 4、数据监听模块observer

《Java 8 in Action》Chapter 8:重构、测试和调试

喜欢而已 提交于 2019-11-28 21:49:34
我们会介绍几种方法,帮助你重构代码,以适配使用Lambda表达式,让你的代码具备更好的可读性和灵活性。除此之外,我们还会讨论目前比较流行的几种面向对象的设计模式, 包括策略模式、模板方法模式、观察者模式、责任链模式,以及工厂模式,在结合Lambda表达式之后变得更简洁的情况。最后,我们会介绍如何测试和调试使用Lambda表达式和Stream API的代码。 1. 为改善可读性和灵活性重构代码 1.1 改善代码的可读性 Java 8的新特性也可以帮助提升代码的可读性: 使用Java 8,你可以减少冗长的代码,让代码更易于理解 通过方法引用和Stream API,你的代码会变得更直观 利用Lambda表达式、方法引用以及Stream改善程序代码的可读性: 重构代码,用Lambda表达式取代匿名类 用方法引用重构Lambda表达式 用Stream API重构命令式的数据处理 1.2 从匿名内部类到Lambda表达式的转换 将实现单一抽象方法的匿名类转换为Lambda表达式 // 传统的方式,使用匿名类 Runnable r1 = new Runnable(){ public void run(){ System.out.println("Hello"); } } // 新的方式,使用Lambda表达式 Runnable r2 = () -> System.out.println(

设计模式之-观察者模式(Observer)

六眼飞鱼酱① 提交于 2019-11-28 20:32:19
观察者(Observer)模式标准定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 观察者(Observer)模式属于对象行为型模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。这一模式中主要针对两个对象object和Observer。一个object可以有多个Observer,当—个object对象的状态发生改变时,所有依赖于它的Observer对象都得到通知被自动更新。 在JDK中定义了观察者模式: subject -> java.util.Observable(类) observer -> java.util.Observer(接口) 使用 jdk 自带的观察者模式的缺点: 1.Observable是一个类,而不是一个接口,导致Observable类的扩展性不高,不如自己实现的观察者模式灵活。 2.Observable将某些方法保护了起来(setChanged()和clearChanged()为protected),这意味着除非继承自Observable,否则将有关键的方法不能调用。导致无法通过组合的方式使其它类获得Observable类的功能。 同时. Spring 的事件驱动模型使用的是观察者模式。

重构改善既有代码的设计

随声附和 提交于 2019-11-28 19:55:58
本系列是用来记录《重构,改善既有代码的设计》这本书的读书笔记。方便自己查看,也方便大家查阅。 欲速则不达,欲达则欲速! 重构,绝对是写程序过程中最重要的事之一。在写程序之前我们不可能事先了解所有的需求,设计肯定会有考虑不周的地方,而且随着项目需求的修改,也有可能原来的设计已经被改的面目全非了。更何况,我们很少有机会从到到尾完成一个项目,基本上都是接手别人的代码,即使这个项目从头到尾参与,也有可能接手其它组员的代码。我们都有这样的经验,看到别人的代码时感觉就像屎一样,有一种强烈的想重写的冲动,但一定要压制住这种冲动,完全重写,可能比原来好一点,但浪费时间不说,还有可能引入原来不存在的bug,而且,你不一定比原来设计的好,也许原来的设计考虑到了一些你没考虑到的情况。我们写的代码,终有一天也会被别人接手,很有可能到时别人会有和我们现在一样的冲动。所以,我们要做的重构,从小范围的重构开始。 重构不只是可以改善既有的设计,还可以帮助我们理解原来很难理解的流程。比如一个复杂的条件表达式,我们可能需要很久才能明白这个表达式的作用,这时候,抽象出来,起一个易于理解的名字,函数名字很重要,下次再见到的时候,自然知道当初的想法了,好的代码胜过注释,毕竟注释有可能更新的不是很及时。 《重构,改善既有代码的设计》,这是一本经典之作,看过这本书要收获的是,让重构融入整个写代码的过程中

ZooKeeper 的功能和原理

筅森魡賤 提交于 2019-11-27 01:36:30
最近在学习 ZooKeeper 的相关知识,做个笔记,供以后学习和查询使用。 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现。分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、配置维护,名字服务、分布式同步、分布式锁和分布式队列等功能。 一、基本概念 在ZooKeeper 中存在一些基本概念,下面逐一介绍: (1)集群角色 Leader 角色 :Leader 服务器是整个ZooKeeper集群的核心,主要的工作任务有两项: 事物请求的唯一调度和处理者,保证集群事物处理的顺序性。 集群内部各服务器的调度者。 Follower 角色 主要职责是: 处理客户端非事物请求、转发事物请求给 leader 服务器。 参与事物请求 Proposal 的投票(Leader 发起的提案,要求 Follower 投票,需要半数以上follower节点通过,leader才会commit数据。) 参与 Leader 选举的投票。 Observer 角色 Observer 是 ZooKeeper 3.3 开始引入的一个全新的服务器角色,该角色充当了观察者的角色。观察ZooKeeper集群中的最新状态变化并将这些状态变化同步到 observer 服务器上

   Oracle CTSS时间同步

半世苍凉 提交于 2019-11-26 15:40:00
Oracle CTSS时间同步 2016年05月25日 16:24:08 WarriorTan 阅读数:3995更多 个人分类: RAC原理|CTSS|CRS|CSS等 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiaping0424/article/details/51499435 概述 OCTSSD(Oracle Cluster Time Synchronization Service Daemon)进程被用于集群服务器之间的时间同步。 CTSS时间同步服务作为Clusteware的一部分被安装,在系统中, 如果察觉到时间同步服务或者时间同步服务配置,那么CTSS将以观察模式(Oberver Mode)启动和运行 ,不执行时间同步操作。CTSS守护进程能随时被安装,并将一直运行, 但是只有在系统符合配置条件情况下才会起作用。如果NTP不存在于任何的集群服务器中,CTSS将被激活 ,接管集群的时间管理工作,以活动模式(Active Mode)启动和运行,使用集群其中一个服务器作为参考服务器,同步集群中的其他服务器的时间。 下面查看RAC节点1和节点1的CTSS服务的状态,发现都处于观察者模式状态(Observer mode): 节点1: root@quyu11 ~]# su - grid [grid@quyu11 ~]$

网页应该如何录屏呢?

陌路散爱 提交于 2019-11-25 17:02:33
摘要: 网页应该如何录屏呢? 作者: Winty 原文: 用户行为录帧调研 Fundebug 经授权转载,版权归原作者所有。 关键点 首先,每一次会话都有一个唯一的session ID,这是串联起所有行为的纽带。 其次,用户行为又分成两个部分,其一是用户的操作,比如鼠标滑动,点击,页面滚动等,其二是页面的变化。这两者我们都统称为用户行为,记录在同一个队列中。 一开始的时候,系统会记录下初始的页面作为第一帧,这是唯一的一次完整页面记录。 针对用户操作,我们会记录事件的类型,鼠标位置等关键信息,保存到队列中。 针对页面变动,我们会起一个mutationObserve侦听页面的改动,每次只记录改动的部分,保存到队列中。 无论是事件还是页面改动,都是对等的一帧,每一帧都会有当前时间,与上一帧间隔时间等基本信息用户还原 一旦出错,SDK就把队列发送到监控系统,并清空当前队列。 还原端根据记录的行为队列,根据时间逐一播放出来。最终形成一个类似于视频的效果。 初步思路 方式一: 前端收集信息,首先,初始化的时候记录一个页面的初始状态,然后利用 MutationObserver 监听dom的改变事件,然后监听所有的鼠标事件、滚动事件等等所有的页面变化。 在合理的时机把这些信息队列上传到服务器,如页面出错时等。 后台分析前端收集到的信息,转为图片,然后形成"视频",或者用户行为栈。提供对应的调用