作者adrianshum (Alien)
看板java
標題Re: [問題] sleep或wait過程中把code做完?
時間Wed Jan 18 17:57:40 2012
雖然文章被鎖了, 但我覺得這裡有些東西還是蠻有討論價值的,
故我也硬來回一篇了. 不過, 你的文章還是請修改好, 訓練一下
良好的發問習慣, 對你對大家都有好處
這篇犯了兩個大錯誤, 而兩個錯誤我想蠻多初學者都會搞錯,
我嘗試簡單說一說.
1) wait()
首先是用 wait() 的部份. 看來原 po 是完全誤會了 wait
的用途. wait 是與 notify/notifyAll 搭配使用的, 要是你
不明白這堆是什麼, 那就代表你真的用錯 而不是我誤會了你 :P
wait/notify 的功用是什麼, 請看小弟很久很久以前在別站貼
而又有轉過來的文章 (
#14Q6Qq00 )
2) UI Thread
改了 sleep(), 沒錯是能跑了, 可是好像中間發生的東西都不見
了, 只有結果, 是嗎? 這也是新手常搞錯的東西.
我猜你文中的 code 是在某 UI event 的 handler 中寫的 對嗎?
(就是比如 button down event 發生時候跑的 code)
要理解為什麼會失去了中間發生的東西, 要先明白 UI thread/event thread
的概念. (以下的並不是 Java 特有, 我所知道的絕大部份 UI framework
都是類似)
用超簡單的方法來形容, 就是有一條特別的 thread, 這條 thread 的
功用很多, 比如實際 update 畫面, 和當有事件發生的時候 invoke
你的 event handler
┌──┐
│ ↓
│ 取event()
│ ↓
│ 要是有 event, 跑 onClick(...)
│ ↓
│ 繪畫畫面()
└──┘
這thread 做的就是不斷的 loop 類似上面的流程.
最簡單的情況, 現在你在 onClick 設 button 為藍色, 實際上你只是把
button object 裡的 "顏色" 設了值為 "藍色" 而已, 這個動作並沒有真
的去修改畫面上的東西, 真正改變顏色是當 UI thread 跑到 "繪畫畫面()"
的時候, 再跟據那堆 UI 相關 Object 的狀態畫的.
好了, 你在 onClick 裡設完綠色, sleep 10 秒, 再設藍色, 這些動作都
不會影響 UI, 因為 UI thread 根本沒機會跑到 "繪畫畫面()" 這一步,
到 繪畫畫面() 這一刻, 它只看到, "哦~ button 的顏色是 藍, 我照著
畫就行了"
所以, 在這些 event hook, 應該只做時間短的 logic, 不然, 不單畫
面不如你所想的更新, 更會因為你的 onClick 讓 UI thread 停著,
而不能繼續去 取event(), 整個 UI 在這段時間內就完全沒有反應了.
至於正確的做法?
其中一種做法: 先修改為綠色, 然後生成另外一條 thread (可利用 Timer),
這 thread 做的是: 1) 睡 10秒, 2) update button 為藍色, 3)觸發畫面重繪.
, 本身的 method 就直接 return, 好讓 UI thread 能繼續.
希望這些簡介能幫助初學者 (其實我也是) 理解一下這兩個常見
錯誤.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.238.156.185
→ adrianshum:補充一下, 文中提到的"UI thread" 有很多名字, 比如 01/18 18:08
→ adrianshum:UI Thread, Event Loop, Event Dispatching Thread etc 01/18 18:09
推 LaPass:推這篇 01/18 22:38
推 p52189:推!!! 01/19 12:47