当前位置: 首页 > 知识库问答 >
问题:

java - 请教一下监听事件的原理,监听一个值的变化一般咋实现呀?

逄宁
2024-03-15

一直有个疑惑,监听事件的原理咋实现的,例如不用导网上的模块包,自己写一个监听的项目或者模块包,监听某个值变化了,例如某个数据是否存在变化。

我只能想到While循环,一直扫描触发的时间,当然定时器更好。但定时器的实质还是循环呀。

所以监听值的变化一般咋实现呀while?感觉死循环总感觉资很容易挂。但是我接触过底层单片机也是用 while 实现的,还有PLC,主程序(main)都是一个无限扫描程序。

while,死循环,但感觉对系统不太好(while 内只要有一个小小的 bug 就很致命,我有过几次电脑崩溃重启了)。

> 在此谢谢各位大佬了

共有2个答案

那昊
2024-03-15
class P {    private int a;    private Observer observer    public void setA(int a) {        this.a = a;        observer.notifyDataChanged();   }}

类似这种,你在需要监听的地方设置个 observer,如果多个地方监听就用list,这样有地方改变了a的值, 别的地方就能知道值改变了

白念
2024-03-15

一般这种都需要用到具体编程语言开放的 元编程 的能力,从底层去劫持对数据的访问,比如在 js 中的 ProxyObject.defineProperty

const obj = new Proxy({ bar: 1 }, {    set(...args) {        console.log('update:', args);        Reflect.set(...args)    } })obj.bar = 2; // update: ...

通过上层对已有数据结构做封装也是可行的路径,但需要引入一些概念和约束,会提高使用者的学习成本,比如通过发布订阅模式封装一种数据结构

// 订阅器class Emitter {    private __hooks__ = {};    public on(type, hook) {        const hooks = this.__hooks__[type] || (this.__hooks__[type] = []);        hooks.push(hook);    }    public emit(type, ...args) {        const hooks = this.__hooks__[type];        if (hooks) {            hooks.forEach((hook) => {                hook(...args);            })        }    }}// 数据类class Data {    private __store__ = {};        public emitter = new Emitter();    constructor(initialData = {}) {        Object.assign(this.__store__, initialData);    }    public get(key) {        this.emitter.emit('get', key);        return this.__store__[key];    }    public set(key, value) {        this.__store__[key] = value;        this.emitter.emit('change', key, value);    }}// 使用const obj = new Data({    bar: 1})// 订阅数据变化obj.emitter.on('change', (key, value) => {    console.log('key changed', key, value);})obj.set('bar', 2); // key changed bar 2
 类似资料:
  • 本文向大家介绍vue监听滚动事件实现滚动监听,包括了vue监听滚动事件实现滚动监听的使用技巧和注意事项,需要的朋友参考一下 在vue中实现滚动监听和原生js无太大差异,下面是一个简单的demo,可在控制台查看结果 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • Blade 中提供一个方法帮助开发者可以自定义的监听应用程序运行中的一些生命周期。比如 Session 的创建与销毁,应用启动结束后等。 支持的事件类型有如下: public enum EventType { SERVER_STARTING, // 服务准备启动 SERVER_STARTED, // 服务启动成功 SERVER_STOPPING, //

  • Nutz.Ioc 容器有三种事件: 对象被创建(create事件) 对象被从容器中取出(fetch事件) 对象被销毁(depose事件) 在这三种时刻,你如果想做一些特殊的操作,比如,当一个数据源被销毁时,你希望能够关闭所有的连接, 声明一下,你想监听什么事件,以及怎么监听。 注: 如果你的对象是 "singleton: false",那么容器创建了对象后就会立即忘记它的存在。因为鬼才知道 你打算

  • 全局事件 事件监听 注解监听 以imi/src/Listener/Init.php为例 <?php namespace Imi\Listener; use Imi\Event\EventParam; use Imi\Event\IEventListener; use Imi\Bean\Annotation\Listener; /** * @Listener(eventName="IMI.IN

  • Chrome DevTools命令行API提供了多种方式来观察和检查事件监听器。JavaScript在交互式页面中起着中心作用,并且浏览器为您提供了一些有用的工具来调试事件和事件处理程序。 TL;DR 使用monitorEvents()监听某一类型的事件。 使用unmonitorEvents()停止监听。 使用getEventListeners()获取DOM元素的监听器。 使用Event List

  • sTree触发容器上的各种事件。您可以查看所有事件的列表以了解要听的内容。 要获取有关事件的更多信息,请检查其data参数。 在大多数情况下,涉及节点的情况下,您将传递整个节点对象。如果在某处获取ID字符串并想要检查该节点,则只需使用 .get_node()。内部节点对象与用于加载的JSON格式非常相似,但是具有一些额外的属性,这可能很有用:children是节点的直接子节点的children_d