java 板


LINE

雖然文章被鎖了, 但我覺得這裡有些東西還是蠻有討論價值的, 故我也硬來回一篇了. 不過, 你的文章還是請修改好, 訓練一下 良好的發問習慣, 對你對大家都有好處 這篇犯了兩個大錯誤, 而兩個錯誤我想蠻多初學者都會搞錯, 我嘗試簡單說一說. 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
1F:→ adrianshum:補充一下, 文中提到的"UI thread" 有很多名字, 比如 01/18 18:08
2F:→ adrianshum:UI Thread, Event Loop, Event Dispatching Thread etc 01/18 18:09
3F:推 LaPass:推這篇 01/18 22:38
4F:推 p52189:推!!! 01/19 12:47







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP