我只想在延迟 2 秒的循环中显示每次迭代的值。
当我运行代码时,主线程卡住,一段时间后只显示 tv_t1: 19
的值。
任何人都可以让我知道下面发布的代码中有什么错误或我遗漏了什么吗?
注意:
我想在主线程上这样做。
*代码
tv_t1 = (TextView) findViewById(R.id.tv_t1);
tv_t2 = (TextView) findViewById(R.id.tv_t2);
for(int i = 0; i < 20; i++) {
tv_t1.setText("t1:" + i);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
最佳答案
Thread
是Android的main/UI
线程,设置sleep(value)
会导致主线程 hibernate 或
在预定的时间停止工作。如果你想更新main UI
和sleep
一段时间,最好创建一个新的thread
然后创建Runnable
覆盖 Run()
的对象。在 Run()
中,您可以调用耗时的函数,也可以让您创建的新 thread
进入 sleep
而不是强制UI thread
到 sleep
,这将导致所有主要的 UI
元素卡住。下面代码中的Handler
作为thread
和message queue
的中间层,你也可以替换h1
使用您的 tv_1
将其作为消息发布到队列中,然后更新您的 View 。
请尝试下面的代码:
Handler h1 = new Handler();
Thread t1;
t1 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
loop();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
t1.start();
protected void loop() throws InterruptedException {
// TODO Auto-generated method stub
for (i = 0; i < 20; i++) {
t1.sleep(2000);
h1.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
tv_t1.setText("tv_1: " + i);
}
});
}
}
关于java - 更新主线程不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27089181/