handler post(Runable)运行在哪个线程
看下源码就很清楚了,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);