我只想显示循环中每次迭代的值,延迟时间为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();
}
}
答案 0 :(得分:2)
Thread
是Android的main/UI
主题,设置sleep(value)
会导致主线程休眠或
在预定的时间内停止工作。如果您想暂时更新main UI
和sleep
,最好创建一个新的thread
,然后创建覆盖Runnable
的{{1}}对象。在Run()
内,您可以调用耗时的函数,也可以将您创建的新Run()
设为thread
,而不是强制sleep
转换为UI thread
这将导致所有主要sleep
元素冻结。以下代码中的UI
作为Handler
和thread
之间的中间人,您也可以将message queue
替换为h1
,将其作为消息发布到队列,然后更新您的视图。
请尝试以下代码:
tv_1
答案 1 :(得分:1)
UI线程上的Thread.sleep是一个坏主意。使用处理程序:
private Handler mHandler = new Handler():
private class MyRunnable implmenets Runanble {
private final static int MAX_INT = 20;
private int mCounter = 0;
@Override
public void run() {
if (mCounter == 20) {
mHandler.removeCallbacks(this);
return;
}
mytexts.setText(" " + mCounter);
mCounter++;
mHandler.postDelayed(this, 2000);
}
}
并在您的创建中,在初始化视图后,请致电
mHandler.postDelayed(new MyRunnable(), 2000);
答案 2 :(得分:0)
也许这会成功:
for(int i = 0; i < 20; i++) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
tv_t1.setText("t1:" + i);
}
}, 2000);
}
是的,如果你在&#34; i&#34;的价值时出现延迟为0然后在循环外设置第一个文本并以i = 1开始循环或在循环中放入一个if-else块
希望它有所帮助。