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

异步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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php注册登录遍写入 遍验证,自动注册登录验证机制的php代码

在phpwind站点后台添加“广告管家”(CNZZ的一款广告投放的应用)的应用,整个“广告管家”通过iframe载入,载入的具体内容根据不同站点显示针对该站点的具体内容。出于意用性方面的考虑,需要以下二点:1、首次进入“广告管家”页面自…

转载:tensorflow保存训练后的模型

训练完一个模型后,为了以后重复使用,通常我们需要对模型的结果进行保存。如果用Tensorflow去实现神经网络,所要保存的就是神经网络中的各项权重值。建议可以使用Saver类保存和加载模型的结果。 1、使用tf.train.Saver.save()方法保存模型 tf.…

php url传递变量,php – 在laravel中通过url传递变量

我是laravel的新手,我正在努力让我的网址格式正确.格式为http://mysite/blog?category1 instead of http://mysite/blog/category1这些是我正在使用的文件,有没有办法将路由放入BlogControllerRoute.phpRoute::get(blog/{category}, function($category null){// get all the…

Apache Wicket:记住我的功能

在Web应用程序中,具有“记住我”功能非常普遍,该功能使用户每次访问我们的网站时都能自动登录。 可以使用Spring Security来实现这种功能,但我认为将基于请求的身份验证框架与基于组件的Web框架结合使用并不是最好的主意。 这两个世界不能很好…

Ubuntu 安装中文

系统环境: 1. 官网 http://pinyin.sogou.com/linux/ 下载安装包。 2. 先运行 apt-get update 。 3. 再运行 apt-get -f install 。 4. 再运行 可能有的UBuntu系统自带了。 5. 如果下载的搜狐输入法安装包的格式为 .deb 的, 运行 : dpk…

Eigen教程(10)

整理下Eigen库的教程,参考:http://eigen.tuxfamily.org/dox/index.html 混淆 在Eigen中,当变量同时出现在左值和右值,赋值操作可能会带来混淆问题。这一篇将解释什么是混淆,什么时候是有害的,怎么使用做。 …

matlab把符号数,Matlab 符号与数值之间的转换

符号运算得到的是精确的解析解,但是有时需要进行数值转换,主要通过以下几个函数实现。1.digits 函数调用方法:digits(D)函数设置有效数字个数为D的近似解精度。2.vpa 函数vpaVariable-precision arithmeticSyntaxR vpa(A)R vpa(A,d)Descrip…

JSF组件库–质量不只是零缺陷

自从我上次研究三个主要JSF组件库的质量以来,已经有一段时间了。 2009年12月,我开始比较RichFaces,Primefaces和ICEfaces的整体软件质量 。 从那时起,事情发生了变化,从现在开始,我想重新评估和更新它。 我…

[API档案]GetDlgItem

函数功能 用于获取指定对话框函数控件的句柄。 API函数原型 1 HWND WINAPI GetDlgItem( 2 _In_opt_ HWND hDlg, //指向包含该对话框的句柄 3 _In_ int nIDDlgItem //第二个参数是控件的名称 4 ); 范例 可参见ComboBox_AddString宏的范例【点击这里】转载于:ht…

嵌入式实时系统的任务设计

嵌入式实时系统的任务设计主要为任务函数的设计、任务优先级的安排、任务的数据结构设计,任务之间的同步与通信设计。 一.任务函数的设计 任务函数按任务结构可分为单次执行任务、周期执行任务和事件触发任务,各任务的主要差异点如下&#xf…

mssql php 5.4,PHP5.4如何连接MSSql Server2005

windows系统下,PHP5.3以上的版本已经不支持mssql扩展,所以如果你需要和sql server通信需要到http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx自行下载微软提供的The SQL Server Driver for PHP。下载后解压缩,将所有的.dll文件拷贝…

将原生SQL功能休眠到您的Spring Data Repository中

JPA为您提供NamedNativeQuery以便使用本机SQL。 但是,用法不是很方便,尤其是当您需要在本机SQL中映射多个实体时。 您必须定义一组容易出错的SqlResultSetMapping映射。 对于以前使用过Hibernate本机SQL功能的用户,您会发现它比JPA的NamedNat…

创建yii的第一个应用

原文链接转载于:https://www.cnblogs.com/Baronboy/p/6354522.html

字符串匹配(KMP 算法 含代码)

主要是针对字符串的匹配算法进行解说 有关字符串的基本知识传统的串匹配法模式匹配的一种改进算法KMP算法网上一比較易懂的解说小样例1计算next 2计算nextval代码有关字符串的基本知识 串(string或字符串)是由零个或多个字符组成的有限序列,一…

php数组转为js json,javascript-将数组php转换为JSON时出错

我在将多维PHP数组转换为JSON时遇到了一些麻烦.我使用json_encode进行了转换,但它为null.我正在尝试开发orgChart,数据是从CSV文件中读取的,并保存在数组中.布局和JS代码用于接收JSON文件,因此我需要使用这种格式.这是数组的一部分,其中包含175个数组Array([2] > Array([id]…

UVa 10954 全部相加(Huffman编码)

https://vjudge.net/problem/UVA-10954 题意:有n个数的集合S,每次可以从S中删除两个数,然后把它们的和放回集合,直到剩下一个数。每次操作的开销等于删除的两个数之和,求最小开销。 思路:Huffman编码。 1 #…

serialVersionUID的作用以及如何用idea自动生成实体类的serialVersionUID

转载:http://blog.csdn.net/liuzongl2012/article/details/45168585 serialVersionUID的作用: 通过判断实体类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVer…

js post方式请求另外一个php,利用JS使用POST方式提交请求的方法(结合代码详细解答)...

下面是我给大家整理的利用JS使用POST方式提交请求的方法,有兴趣的同学可以去看看。一般都是写上隐藏的form标签,用来调用js函数然后submit全部用js来写也行,以下是我在一个问答频道看见别人写的例子,放在这里function post(URL, P…

JBoss BRMS最佳实践– BPM流程初始化层的提示

我过去发布过一些有关迁移策略的文章,仔细研究了流程层,并提供了一些有关jBPM的最佳实践 ,它们都涉及到BPM策略的非常具体的部分。 我想重新讨论最佳实践的主题,然后在智能集成企业级别上,我们讨论使用JBoss BRMS对您的…

寒假作业二:汇总随笔

随笔一:解题思路随笔二:自学计划 转载于:https://www.cnblogs.com/mercuialC/p/6359997.html