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

长时间运行的处理

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

实时更新

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

基本概念

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

后台处理

长时间运行的处理用例中,减少UI阻塞的最明显方法是将昂贵的处理从UI线程转移到某些后台线程。 能够理解哪种线程将在应用程序的不同部分中运行代码非常重要。 例如,在ZK应用程序中,大多数代码由servlet线程执行,这些线程基本上是与UI线程等效的servlet世界。 为了在某​​些后台线程中执行代码,我们需要一个线程池。 最简单的方法是使用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使用Javascript进行正常的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更新和后台处理–第1部分相关推荐

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

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

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

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

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

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

  4. WPF多线程UI更新

    前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对象.)这是很常见的一个错误,一不小 ...

  5. WPF多线程UI更新——两种方法

    WPF多线程UI更新--两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...

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

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

  7. 网站服务器处理器计划怎么设置,系统属性-高级-处理器计划选程序还是后台.docx...

    系统属性-高级-处理器计划选程序还是后台 一.每天关机前要做的清洗: 双击"我的电脑"--右键点C盘--点"属性"--点"磁盘清理"--点& ...

  8. 最新ChatGPT网站源码/支持用户注册付费套餐/支持Ai绘画/支持用户会员套餐/邀请分佣功能/支持后台一键更新/网站后台管理/永久更新

    前言 ChatGPT 是一个基于 GPT-3.5/GPT-4 模型的对话系统,它主要用于处理自然语言对话.ChatGPT 虽然才发布几天时间,但是就已经火爆全网了.然后陆陆续续已经出现了各式版本,今天 ...

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

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

最新文章

  1. python基础知识-11-函数装饰器
  2. OSChina 周三乱弹 —— 孤独到都和病毒发生了感情了
  3. Quartz.net持久化与集群部署开发详解
  4. 编程的精髓:发现问题,解决问题
  5. python选择语句_3.1Python的判断选择语句
  6. CentOS 7安装ifconfig
  7. 让2个并列的div根据内容自动保持同等高度js
  8. Thingsboard 3.1.0 - 源码编译
  9. Intel8251可编程串行扩展RS232串口
  10. IVX低代码平台开发——微信小程序实现抽奖功能
  11. Python PDF文件合并,提取
  12. 微信公众号密码转换的密钥
  13. 微服务架构集成RabbitMQ给用户推送消息(发送短信,发送邮件,发送站内信息)
  14. 完美的Pornhub风格的Logo生成器,在线工具
  15. Docker容器搭建运行python深度学习环境
  16. [随文杂记]生男好还是生女好?
  17. 华为云 Tomcat配置https证书
  18. 如何免费给PDF文档进行加密?
  19. APP前端和后台怎么进行数据交换的
  20. 为什么 HTTPS 比 HTTP 更安全?HTTPS 如何保证数据传输安全性

热门文章

  1. qmc0转换mp3工具_GoldenRecords for Mac(唱片录音转换软件)
  2. selenium 等待_Selenium等待:内隐,外显,流利和睡眠
  3. 自动化测试在CI CD管道中的作用
  4. 将应用程序集成为Heroku附加组件
  5. Java 11快多少?
  6. Apache Camel 3的工作终于开始了
  7. .net2.0 orm_Hibernate 4.3 ORM工具
  8. gradle构建工具_Gradle:我们需要另一个构建工具吗?
  9. java嵌入式db_Java DB嵌入式模式
  10. PagingAndSortingRepository –如何与Thymeleaf一起使用