zk ui

异步UI更新非常有用,因为它们通常可以提高响应性,可用性和用户界面的总体感觉。 我将在这里重点介绍ZK框架,但是通常,相同的原理也适用于桌面UI(Swing,SWT)。

长时间运行的处理

有时您可能需要进行数据库查询,或者需要很长时间才能进行外部Web服务调用。 通常,这些作业是同步的,因此基本上在代码中有一个特定的点,系统将必须等待结果并阻塞运行代码的线程。 如果最终在UI线程中运行了这样的代码,则通常会完全阻塞UI。

实时更新

有时您不预先知道应更新UI中的某些内容的确切时间。 例如,您可能有一个可视仪表,用于显示应用程序中的用户数量。 当新用户进入应用程序时,应尽快更新当前用户的UI,以反映新用户数。 您可以使用基于计时器的机制来连续检查用户数量是否已更改,但是如果同时存在的用户过多,则即使UI中没有实际更新的内容,连续检查也将导致非常重的负载。

基本概念

让我们首先摘录此博客文章的标题:“异步UI更新和后台处理”

后台处理

长时间运行的处理用例中,减少UI阻塞的最明显方法是将昂贵的处理从UI线程转移到某些后台线程。 能够理解哪种线程将在应用程序的不同部分中运行代码非常重要。 例如,在ZK应用程序中,大多数代码由servlet线程执行,这些线程基本上是servlet等效于UI线程的世界。 为了在某​​些后台线程中执行代码,我们需要一个线程池。 最简单的方法是使用JDK5中引入的java.util.concurrent.ExecutorService。 我们可以将Runnable对象推送到ExecutorService,因此我们基本上是在要求ExecutorService在某些后台线程中运行特定的代码块。

绝对关键的是,使用ThreadLocals的框架会遇到这种方法的问题,因为在servlet线程中设置的ThreadLocals在后台线程中将不可见。 一个例子是Spring Security,默认情况下使用ThreadLocal来存储安全上下文(=用户身份+其他东西)。

异步UI更新

在这种情况下,异步UI更新意味着什么? 基本上,这个想法是,一旦我们有了一些要在UI中呈现的信息,我们就会通知UI新数据(=异步),而不是直接在后台线程中更新UI(=同步)。 我们无法事先知道新信息何时可用,因此我们无法从客户端请求信息(除非我们使用昂贵的轮询)。

服务器推送ZK

使用ZK,基本上,我们可以使用两种不同的方法来在后台线程获取新信息后更新UI。 名称“服务器推送”来自以下事实:服务器具有一些必须推送到客户端的新数据,而不是典型的工作流程(客户端向服务器询问信息)。 首先,您可以通过使用Executions.activate / deactivate抢占对桌面的独占访问权限来进行同步更新。 我个人不鼓励这样做,因为一旦您拥有独占访问权,UI线程将不得不等待直到停用桌面。 这就是为什么我在这篇博客文章中根本不会介绍这种方法的原因。

另一方面,异步更新是通过使用Executions.schedule完成的,它符合常规事件处理的Event / EventListener模型。 这个想法是,我们可以将普通的ZK Event对象推送到EventListeners,客户端将被告知这些事件。 之后,ZK使用Java脚本执行正常的AJAX请求,事件将由EventListeners处理。 这意味着,如果我们使用异步更新,则所有实际的事件处理将由Servlet线程完成,并且所有ThreadLocals照常可用。 这使编程模型非常简单,因为您只需要普通的事件侦听器方法,而无需复杂的并发编程。

这是一个小例子:

public class TestComposer extends GenericForwardComposer {private Textbox search;public void onClick$startButton() {if (desktop.isServerPushEnabled()) {desktop.enableServerPush(true);}final String searchString = search.getValue();final EventListener el = this; // All GenericForwardComposers are also EventListeners// Don't do this in a real-world application. Use thread pools instead.Thread backgroundThread = new Thread() {public void run() {// In this part of code the ThreadLocals ARE NOT available// You must NOT touch any ZK related things (e.g. components, desktops)// If you need some information from ZK, you need to get them before this code// For example here I've read searchString from a textbox, so I can use the searchString variable without problemsString result = ... // Retrieve the result from somewhereExecutions.schedule(desktop, el, new Event('onNewData', null, result));}};backgroundThread.start();}public void onNewData(Event event) {// In this part of code the ThreadLocals ARE availableString result = (String) event.getData();// Do something with result. You can touch any ZK stuff freely, just like when a normal event is posted.}
}

在下一部分中,我将向您展示如何使用JDK5 ExecutorServices运行任务而无需手动创建线程。 如果您真的想了解ZK服务器推送,还应该阅读相关的ZK文档 。

祝您编程愉快,别忘了分享!

参考: Advanced ZK:异步UI更新和后台处理– Jawsy Solutions技术博客博客上的JCG合作伙伴 Joonas Javanainen的第1部分 。

翻译自: https://www.javacodegeeks.com/2012/09/advanced-zk-asynchronous-ui-updates-and.html

zk ui

zk ui_高级ZK:异步UI更新和后台处理–第1部分相关推荐

  1. zk ui_高级ZK:异步UI更新和后台处理–第2部分

    zk ui 介绍 在第1部分中,我展示了如何在ZK应用程序中使用服务器推送和线程来执行后台任务. 但是,这个简单的示例具有一个重大缺陷,这使其对于实际应用程序而言是一种不好的方法:它为每个后台任务启动 ...

  2. 高级ZK:异步UI更新和后台处理–第2部分

    介绍 在第1部分中,我展示了如何在ZK应用程序中使用服务器推送和线程来执行后台任务. 但是,这个简单的示例具有一个重大缺陷,这使其对于实际应用程序而言是一种不好的方法:它为每个后台任务启动了一个新线程 ...

  3. 高级ZK:异步UI更新和后台处理–第1部分

    异步UI更新非常有用,因为它们通常可以提高响应性,可用性和用户界面的总体感觉. 我将在这里重点介绍ZK框架,但是通常,相同的原理也适用于桌面UI(Swing,SWT). 长时间运行的处理 有时,您可能 ...

  4. ONLYOFFICE文档V7.2现已发布————插件市场、实时查看器、连写、全新表单字段、UI 更新等

    ONLYOFFICE文档V7.2现已发布 ----插件市场.实时查看器.连写.全新表单字段.UI 更新等 我们已在最新版本的在线编辑器中提供了多种实用性改进,比如:轻松的插件安装流程.实时查看器.支持 ...

  5. 易语言多线程大漠多线程模板UI更新

    UI更新就是对窗口的组件超级列表框发送读写,采用了封装. 大漠多线程模板源码: .版本 2 .支持库 iext.子程序 UI_更新, , , 用来更新窗口的超级列表框相关线程信息 .参数 主序号, 整 ...

  6. (转)WTL入门(5)--- 高级的对话框UI类

    源代码:http://download.csdn.net/source/3522809 上一篇文章中,讲述了一些WTL的关于对话框和控件的特性,本章中将讲述的新的WTL类实现了一些高级UI特性:所有者 ...

  7. WTL入门(5)--- 高级的对话框UI类

    源代码:http://download.csdn.net/source/3522809 上一篇文章中,讲述了一些WTL的关于对话框和控件的特性,本章中将讲述的新的WTL类实现了一些高级UI特性:所有者 ...

  8. [UE4]RetainerBox,控制UI更新频率,把渲染后的UI当成Texture

    RetainerBox是一个容器,只会影响其容器内的UI,RetainerBox的作用: 一.控制UI更新频率(可能是为有优化性能) 1.在UserWidget中添加Retainer Box容器,并在 ...

  9. php延迟更新,ThinkPHP开发指南-模型-高级模型之延迟更新

    导航:上一页 我们经常需要给某些数据表添加一些需要经常更新的统计字段,例如用户的积分.文件的下载次数等等,而当这些数据更新的频率比较频繁的时候,数据库的压力也随之增大不少,我们可以利用高级模型的延迟更 ...

最新文章

  1. Windows 下面的 redis GUI操作工具
  2. 用位运算实现四则运算之加减乘除
  3. ni软件可以卸载吗_最强大的电脑端卸载软件!和你想的一样吗?进来看看!
  4. canvas 实现图片局部模糊_JavaScript中的图片处理与合成(四)
  5. 重新解读DDD领域驱动设计(一)
  6. java同名函数_浅谈Java 继承接口同名函数问题
  7. java-web的mybatis的学习
  8. linux tunl0 ip,Centos7下lvs负载均衡lvs-tun模式配置
  9. 【常用表】线性代数公式
  10. Junos CLI常用命令
  11. Visual Studio安装教程
  12. qq邮箱登录收件服务器是什么,你好请问qq邮箱收件服务器不能为空是什么意思...
  13. 台式计算机调亮度快捷键,台式电脑怎么调节屏幕亮度
  14. 使用Python获取股票实时数据和历史数据
  15. 灵感专题—2019年优秀网页设计作品赏析#4月
  16. HDU 2565 放大的X【图形】
  17. 影响不良贷款拨备覆盖率的因素分析
  18. MuleSoft知识总结-1.MuleSoft的简要介绍
  19. Android的显示色彩位数
  20. MAYA中 快速Bake物体关键帧

热门文章

  1. 使用GZIP和Zip压缩Java数据流
  2. ERROR in multi ./src/main.js dist/bundle.js
  3. 计算机专业毕业后能做什么工作?
  4. java实现人脸识别源码【含测试效果图】——Dao层(BaseDao)
  5. javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
  6. java实现字符逆序输出
  7. $router VS $route
  8. docker 安装elasticsearch
  9. java使用:: 表达式_Java 12:开关表达式
  10. apache isis_使用Apache Isis快速进行SEMAT应用程序开发