作者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
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