高級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.pswp.cn/news/371618.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371618.shtml
英文地址,請注明出處:http://en.pswp.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