本文主要讲了在Oracle jdeveloper 的MAF开发中,如何用线程来实现页面组件的同步简单类型数据刷新。

一、PropertyChangeSupport

1. 首先介绍下PropertyChangeSupportPropertyChangeSupport提供了2个监听器接口,一个是addPropertyChangeListener,另一个是removePropertyChangeListener,当一个实例注册了该Bean的监听器,那么当Bean中的属性值发生变化的时候,会通知所有注册到该Bean的实例。

2. 如何创建PropertyChangeSupport

a. 创建一个PrintLogBO.java

b. 新建一个String类别的属性,名为Single_Log;

c. 在Jedeveloper中,在代码区点击右键,选择Generate Accessors,如下图所示:

点ok后,代码更新为:

public class PrintLogBO {private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);public PrintLogBO() {super();pass = "";}public void setSingle_log(String single_log) {String oldSingle_log = this.single_log;this.single_log = single_log;propertyChangeSupport.firePropertyChange("single_log", oldSingle_log, single_log);}public String getSingle_log() {return single_log;}private String single_log;private String pass;public void startLogThread() {Thread thread = new Thread() {public void run() {for (int i = 0; i < 100; i++) {setSingle_log("Index: " + pass);AdfmfJavaUtilities.flushDataChangeEvent();try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}}};thread.start();}public void addPropertyChangeListener(PropertyChangeListener l) {propertyChangeSupport.addPropertyChangeListener(l);}public void removePropertyChangeListener(PropertyChangeListener l) {propertyChangeSupport.removePropertyChangeListener(l);}
}

我们发现,增加了get, set方法,并且增加了2个监听器。

3. 新建一个测试类Test.java

public class Test implements PropertyChangeListener{public Test() {super();}public void propertyChange(PropertyChangeEvent evt) {// TODO Implement this methodSystem.out.println("fire action");}public static void test(){// a instance of PrintLogBOPrintLogBO printLogBO = new PrintLogBO();// a instance of TestTest test = new Test();// regist a listenerprintLogBO.addPropertyChangeListener(test);// set a new valueprintLogBO.setSingle_log("a new value");}
}

4. 创建一个data control,用test()创建一个按钮,运行设备,当点击按钮的时候,会发现Android Device Monitor 会同步打印log “fire action”
二、 flushDataChangeEvent

当我们需要同步amx页面上组件的值的时候,如果通过此方法,发现只能通过刷新页面来获取最新的值。如果通过刷新AMX页面来显示最新的数据,这样会影响效率和用户体验,因为firePropertyChange方法只是改变的缓存的值,刷新页面后,页面上的值替换成缓存的值。基于此,我们需要用到AdfmfJavaUtilities.flushDataChangeEvent.它可以强制将缓存的值刷新到客户页面上,但是flushDataChangeEvent必须在一个新的线程中存在。下面的例子将演示,在一个AMX页面上,动态显示log的方法。

1. 新建一个PrintLogBO.java,内容如下:

public class PrintLogBO {private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);public PrintLogBO() {super();}public void setSingle_log(String single_log) {String oldSingle_log = this.single_log;this.single_log = single_log;propertyChangeSupport.firePropertyChange("single_log", oldSingle_log, single_log);}public String getSingle_log() {return single_log;}private String single_log;public void startLogThread() {Thread thread = new Thread() {public void run() {for (int i = 0; i < 100; i++) {setSingle_log("Index: " + i);// import methodAdfmfJavaUtilities.flushDataChangeEvent();try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}}};thread.start();}public void addPropertyChangeListener(PropertyChangeListener l) {propertyChangeSupport.addPropertyChangeListener(l);}public void removePropertyChangeListener(PropertyChangeListener l) {propertyChangeSupport.removePropertyChangeListener(l);}
}

新增加了一个方法,startLogThread,在方面里面AdfmfJavaUtilities.flushDataChangeEvent()方法强制将String值的改变推送到AMX页面上

2. 创建一个data control,single_log作为outputText, startLogThread作为Button

        <amx:commandButton actionListener="#{bindings.startLogThread.execute}" text="startLogThread"disabled="#{!bindings.startLogThread.enabled}" id="cb1"/><amx:panelLabelAndMessage label="#{bindings.single_log.hints.label}" id="plam1"><amx:outputText value="#{bindings.single_log.inputValue}" id="ot2"/></amx:panelLabelAndMessage>

3. 运行Android设备,点击按钮,屏幕会动态打印log,运行截图如下:

一段时间后,截图如下:

[References]

1. http://docs.oracle.com/cd/E35521_01/doc.111230/e24475/amxbinding.htm

MAF: Synchronized Data Change Envent相关推荐

  1. 深入详解Oracle data change notification

    深入详解 Oracle  data change notification   0.什么是 Oracle  data change notification  ? 当有多个应用程序或者进程操作同一个数 ...

  2. DRC(Data Replicate Center)

    DRC(Data Replicate Center) DRC用来做什么? 数据双向复制和数据订阅. 比如:跨机房的 Mysql 数据复制. 比如:数据订阅,监听数据库实时变更情况. DRC设计目标? ...

  3. 1. Synchronized

    零 简单用法   同步关键字,用两种用法,一种是加在方法签名上,一种是里面包着一个monitor对象. public class SyncDemo {private static int[] arra ...

  4. jQuery-触发change事件

    1,修改select控件的value,会不会触发change事件? 不会 根据值(value)选中下拉框,不会触发change事件 需要$('#pushTempType').val(data).cha ...

  5. Java多线程模式-Balking模式

    1.场景 自动保存功能: 为防止电脑死机,而定期将数据内容保存到文件中的功能. 2.详细说明 当数据内容被修改时,内容才会被保存.即当写入的内容与上次写入的内容一致时,其实就没有必要执行写入操作.也就 ...

  6. 基于zookeeper实现的分布式锁

    http://www.jiacheo.org/blog/122 zookeeper是hadoop下面的一个子项目, 用来协调跟hadoop相关的一些分布式的框架, 如hadoop, hive, pig ...

  7. Android4.0设置界面修改总结

    为什么80%的码农都做不了架构师?>>>    笔者前段时间完成设置的圆角item风格的修改,但最近,客户新增需求,想把设置做成Tab风格的,没办法,顾客就是上帝,咱得改啊.今天算是 ...

  8. Android--获取App应用程序的大小

    Android对这种方法进行了封装,我们没有权限去调用这个方法,所以我们只能通过AIDL,然后利用Java的反射机制去调用系统级的方法. 下面上代码:(注释比较详细) /*** 作用:-----获取包 ...

  9. Introducing Microsoft Sync Framework: Sync Services for File Systems

    https://msdn.microsoft.com/en-us/sync/bb887623 Introduction to Microsoft Sync Framework File Synchro ...

最新文章

  1. 12306 背后的技术大牛:我不跟人拼智商,我就跟他们拼狠!
  2. 爱立信:SDN/NFV助力面向5G以及工业互联网的ICT转型
  3. js快速判断IE浏览器(兼容IE10与IE11)
  4. SimBERTv2来了!融合检索和生成的RoFormer-Sim模型
  5. 数据库3(DBUtils)
  6. 《一》php多进程编程:第一次fork
  7. elementUI的DatePicker+DateTimePicker组件的自定义日期禁用
  8. python中表示空类型的是_python中什么表示空类型
  9. 95-190-044-源码-window-window三要素
  10. 计算机主板 方便用户自己安装的是,电脑水冷安装教程步骤解析【图文】
  11. 计算机维修基本题,计算机组装与维护试题库附答案.doc
  12. vue3中v-model的重大更新
  13. 608. 两数和-输入已排序的数组
  14. 操作系统 第一部分 操作系统的基本概念
  15. 【15】万魂杀服务器开发之原始NIO、Mina、Netty使用
  16. 【信息系统项目管理师】2018年下半年信息系统项目管理师上午综合知识真题
  17. 脚本和网络课层的联系
  18. 上海2018计算机中级职称,2018中级职称评定申报要求
  19. html5 自动分享到朋友圈,html5手机端分享微信朋友圈代码
  20. 真神奇!敲击桌子就能操控iPad或iPhone

热门文章

  1. 简易中文自动文摘系统(合集)
  2. STM32G474 FPU 浮点处理单元应用和测试
  3. android手机禁止休眠_android设置屏幕禁止休眠的方法
  4. CE工具实例:修改植物大战僵尸植物2
  5. 3、IQ采样【入门软件无线电(SDR)】PySDR:使用 Python 的 SDR 和 DSP 指南
  6. cocos2d-x横版格斗游戏教程3
  7. MATLAB字符串学习笔记
  8. 引领网页设计潮流的优秀网页作品赏析《第二季》
  9. android虚拟内置sd卡,Android: 浅论虚拟SD卡的实现
  10. 短网址缩短网址源码Shortny v2.0.1