我开发了一个应用程序,在Android模拟器屏幕中以定义的间隔显示一些文本。 我正在使用Handler类。 以下是我的代码中的代码段:
handler = new Handler();
Runnable r = new Runnable() {
public void run() {
tv.append("Hello World");
}
};
handler.postDelayed(r, 1000);
当我运行此应用程序时,文本只显示一次。 为什么?
#1楼
Handler handler=new Handler();
Runnable r = new Runnable(){
public void run() {
tv.append("Hello World");
handler.postDelayed(r, 1000);
}
};
handler.post(r);
#2楼
如果我正确理解Handler.post()方法的文档:
导致Runnable r添加到消息队列中。 runnable将在连接此处理程序的线程上运行。
所以@ alex2k8提供的例子即使工作正常也不一样。 如果使用Handler.post() ,则不会创建新线程 。 您只需将Runnable发布到具有Handler的线程即可由EDT执行。 之后,EDT只执行Runnable.run() ,没有别的。
记住: Runnable != Thread 。
#3楼
我相信这种典型情况,即以固定间隔运行某些东西, Timer更合适。 这是一个简单的例子:
myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
// If you want to modify a view in your Activity
MyActivity.this.runOnUiThread(new Runnable()
public void run(){
tv.append("Hello World");
});
}
}, 1000, 1000); // initial delay 1 second, interval 1 second
使用Timer有几个优点:
可以在schedule函数参数中轻松指定初始延迟和间隔
只需调用myTimer.cancel()就可以停止计时器
如果您只想运行一个线程,请记住在安排新线程之前调用myTimer.cancel() (如果myTimer不为null)
#4楼
对您的示例的简单修复是:
handler = new Handler();
final Runnable r = new Runnable() {
public void run() {
tv.append("Hello World");
handler.postDelayed(this, 1000);
}
};
handler.postDelayed(r, 1000);
或者我们可以使用普通线程(使用原始Runner):
Thread thread = new Thread() {
@Override
public void run() {
try {
while(true) {
sleep(1000);
handler.post(this);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
您可以将runnable对象视为可以发送到消息队列以执行的命令,并将handler作为用于发送该命令的辅助对象。
#5楼
new Handler().postDelayed(new Runnable() {
public void run() {
// do something...
}
}, 100);