日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 zk ui_高级ZK:异步UI更新和后台处理–第1部分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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部分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。