|
看下源碼就很清楚了,view.post(Runnable)內部實際還是使用的handler.post(Runnable),而這個方法,內部會執行下面的方法,從而把Runnable設置為Message.callback,實際上相當於handler.sendMessage(),只是發送了一個消息,
private static Message getPostMessage(Runnable r) { Message m = Message.obtain(); m.callback = r; return m; } handler.dispatch()的時候,會調用下面的方法 message.callback.run(); 就是直接調用的Runnable的run方法,並不是strat(),所以僅僅是當做一個有run()的普通類使用而已,並不是開啟了一個新的線程
看下源碼就很清楚了,view.post(Runnable)內部實際還是使用的handler.post(Runnable),而這個方法,內部會執行下面的方法,從而把Runnable設置為Message.callback,實際上相當於handler.sendMessage(),只是發送了一個消息,
private static Message getPostMessage(Runnable r) { Message m = Message.obtain(); m.callback = r; return m; } handler.dispatch()的時候,會調用下面的方法 message.callback.run(); 就是直接調用的Runnable的run方法,並不是strat(),所以僅僅是當做一個有run()的普通類使用而已,並不是開啟了一個新的線程 |
方法一:
(java
習慣,在
android
不推薦使用)
剛剛開始接觸
android
線程編程的時候,習慣好像
java
一樣,試圖用下面的代碼解決問題
new
Thread(
new
Runnable() {
public
void
run() {
myView.invalidate();
}
}).start();
可以實現功能,刷新
UI
界面。但是這樣是不行的,因為它違背了單線程模型:
Android UI
操
作並不是線程安全的並且這些操作必須在
UI
線程中執行。
方法二:(
Thread+Handler)
查閱了文檔和
apidemo
后,發覺常用的方法是利用
Handler
來實現
UI
線程的更新的。
Handler
來根據接收的消息,處理
UI
更新。
Thread
線程發出
Handler
消息,通知更新
UI
。
Handler myHandler =
new
Handler() {
public
void
handleMessage(Message msg) {
switch
(msg.what) {
case
TestHandler.GUIUPDATEIDENTIFIER:
myBounceView.invalidate();
break
;
}
super
.handleMessage(msg);
}
};
class
myThread
implements
Runnable {
public
void
run() {
while
(!Thread.currentThread().isInterrupted()) {
Message message =
new
Message();
message.what = TestHandler.GUIUPDATEIDENTIFIER;
TestHandler.
this
.myHandler.sendMessage(message);
try
{
Thread.sleep(100);
}
catch
(InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
以上方法
demo
看
:
http://rayleung.javaeye.com
/blog/411860
方法三:(
java
習慣,不推薦)
在
Android
平台中需要反復按周期執行方法可以使用
Java
上自帶的
TimerTask
類,
Tim
erTask
相對於
Thread
來說對於資源消耗的更低,除了使用
Android
自帶的
AlarmManager
使用
Timer
定時器是一種更好的解決方法。
我們需要引入
import
java.util.Timer;
和
import java.util.Tim
erTask;
public
class
JavaTimer
extends
Activity {
Timer timer =
new
Timer();
TimerTask task =
new
TimerTask(){
public
void
run() {
setTitle("hear me?");
}
};
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
timer.schedule(task, 10000);
}
}
方法四:
(TimerTask + Handler)
實際上這樣做是不行的,這跟
Android
的線程安全有關!應該通過配合
Handler
來實現
timer
功能的!
public
class
TestTimer
extends
Activity {
Timer timer =
new
Timer();
Handler handler =
new
Handler(){
public
void
handleMessage(Message msg) {
switch
(msg.what) {
case
1:
setTitle("hear me?");
break
;
}
super
.handleMessage(msg);
}
};
TimerTask task =
new
TimerTask(){
public
void
run() {
Message message =
new
Message();
message.what = 1;
handler.sendMessage(message);
