- Live軟件開(kāi)發(fā)面面談
- 潘俊編著
- 1107字
- 2019-07-30 17:55:04
2.6 事件編程的其他細(xì)節(jié)
至此,我們已經(jīng)討論了事件編程的核心及其在幾種語(yǔ)言中的實(shí)現(xiàn)。在實(shí)際應(yīng)用中,事件編程還有一些細(xì)節(jié)的議題。
2.6.1 收聽(tīng)者的執(zhí)行順序
收聽(tīng)者是否按照添加到發(fā)布者的順序執(zhí)行,通常是無(wú)關(guān)緊要的。發(fā)布者可以保持這個(gè)順序,也可以采用其他順序或者無(wú)序執(zhí)行,這都取決于具體的實(shí)現(xiàn)代碼。
2.6.2 收聽(tīng)者是否在單獨(dú)的線程執(zhí)行
發(fā)布者可以在自己所在的線程上逐個(gè)運(yùn)行收聽(tīng)者,也可以為它們開(kāi)設(shè)一個(gè)新的線程,甚至為每個(gè)收聽(tīng)者啟動(dòng)一個(gè)獨(dú)立的線程。采用哪種方案也取決于實(shí)際環(huán)境和需要。在上面的Java和C#的例子中,Swing和Windows Forms圖形用戶界面框架默認(rèn)都是在發(fā)布者所在的線程上運(yùn)行所有收聽(tīng)者。在第3章會(huì)看到這個(gè)線程就是運(yùn)行所謂主循環(huán)或者可稱為事件分派循環(huán)的線程,它首先創(chuàng)建和顯示應(yīng)用程序的用戶界面,然后不停地從操作系統(tǒng)讀取該應(yīng)用程序負(fù)責(zé)的事件,再將它們分派給各個(gè)控件內(nèi)注冊(cè)的收聽(tīng)者,并且逐個(gè)運(yùn)行這些收聽(tīng)者。這種方式可能會(huì)產(chǎn)生一個(gè)問(wèn)題,如果某個(gè)收聽(tīng)者的執(zhí)行時(shí)間很長(zhǎng),例如需要等待網(wǎng)絡(luò)返回的結(jié)果,那么在它運(yùn)行結(jié)束前,用戶在界面上的其他操作都會(huì)被阻塞而沒(méi)有響應(yīng),例如單擊一個(gè)按鈕后,再選擇視窗上的組合框和其他標(biāo)簽頁(yè)這樣簡(jiǎn)單的動(dòng)作,界面都沒(méi)有更新。解決辦法就是減輕負(fù)責(zé)圖形用戶界面的線程的負(fù)擔(dān),為事件收聽(tīng)者新開(kāi)一個(gè)線程,進(jìn)行異步調(diào)用。例如,瀏覽器在一個(gè)標(biāo)簽頁(yè)等待和載入網(wǎng)頁(yè)時(shí),可以繼續(xù)執(zhí)行用戶命令,瀏覽其他標(biāo)簽頁(yè)。Lotus Notes客戶端在打開(kāi)一個(gè)索引更新耗時(shí)較長(zhǎng)的視圖時(shí),能夠在后臺(tái)更新的同時(shí)讓用戶先打開(kāi)其他視圖和文檔。很多支持多線程編程的語(yǔ)言也都能夠方便地進(jìn)行函數(shù)的異步調(diào)用,例如,C#中的代理就自帶BeginInvoke的方法。
2.6.3 控件層次中的事件傳播
很多控件都可以作為容器容納其他控件,被容納的控件又可以容納控件,如此組成的控件層次中,發(fā)生的事件由哪個(gè)控件處理也有多種選項(xiàng)。在Swing和Windows Forms中,事件僅僅由層次中最底端的控件處理。例如,視窗上有一個(gè)面板,面板里有一個(gè)按鈕,給這三個(gè)控件的鼠標(biāo)單擊事件都添加收聽(tīng)者,在按鈕上單擊時(shí),只有按鈕的收聽(tīng)者會(huì)被運(yùn)行。網(wǎng)頁(yè)所用的DOM模型則復(fù)雜得多。事件會(huì)先從最頂層的元件傳播到最底層,再反過(guò)來(lái)從最底層上升到最頂層。收聽(tīng)者在前一階段接收事件稱為捕獲(Capturing),后一階段稱為冒泡(Bubbling)。元件在添加收聽(tīng)者時(shí)可以通過(guò)參數(shù)指定收聽(tīng)者工作于哪個(gè)階段,默認(rèn)是冒泡階段。假設(shè)網(wǎng)頁(yè)上有兩個(gè)DIV元件,其中一個(gè)包容另一個(gè),被包容的DIV里又有一個(gè)按鈕,同樣給這三個(gè)元件的鼠標(biāo)單擊事件都添加收聽(tīng)者,然后單擊按鈕。在冒泡模式下,按鈕的收聽(tīng)者先運(yùn)行,然后是其上一級(jí)的DIV元件的收聽(tīng)者,最后是最上層DIV的收聽(tīng)者。捕獲模式下的順序正好相反。需要時(shí),收聽(tīng)者還能夠調(diào)用事件參數(shù)的stopPropagation方法終止事件的傳播,無(wú)論是在捕獲還是冒泡階段。
- 數(shù)字地圖無(wú)損信息隱藏技術(shù)研究
- 鴻蒙原生應(yīng)用開(kāi)發(fā):ArkTS語(yǔ)言快速上手
- RFID重大工程與國(guó)家物聯(lián)網(wǎng)(第4版)
- 機(jī)載激光雷達(dá)基礎(chǔ)原理與應(yīng)用
- 快修巧修新型手機(jī)(修訂版)
- 等離子彩電維修代換技法揭秘
- 5G系統(tǒng)觀:從R15到R18的演進(jìn)之路
- 數(shù)字平板電視機(jī)維修筆記
- 艦船尾跡的電磁成像機(jī)理及特征提取技術(shù)
- 現(xiàn)代通信原理與技術(shù)
- 大規(guī)模天線波束賦形技術(shù)原理與設(shè)計(jì)
- WCDMA網(wǎng)絡(luò)測(cè)試與優(yōu)化教程
- 電子組裝工藝可靠性
- 衛(wèi)星通信組網(wǎng)控制和管理技術(shù)
- 競(jìng)賽中學(xué)電路