Android 我的程序只显示了i的最后一个值
为什么这个程序只显示textview中i=4的最后一个值Android 我的程序只显示了i的最后一个值,android,multithreading,textview,Android,Multithreading,Textview,为什么这个程序只显示textview中i=4的最后一个值 Public class MainActivity extendsActivity { TextView counter; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ac
Public class MainActivity extendsActivity {
TextView counter;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
counter = (TextView) findViewById(R.id.TV_counter);
Thread t = new Thread() {
public void run() {
runOnUiThread(new Runnable() {
public void run() {
for (int i = 0; i < 5; i++) {
try {
counter.setText("" + i);
System.out.println("Value of i= " + i);
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
};
t.start();
}
}
公共类MainActivity ExtendActivity{
文本视图计数器;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
计数器=(TextView)findViewById(R.id.TV_计数器);
线程t=新线程(){
公开募捐{
runOnUiThread(新的Runnable(){
公开募捐{
对于(int i=0;i<5;i++){
试一试{
counter.setText(“+i”);
System.out.println(“i的值=”+i);
睡眠(100);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
});
}
};
t、 start();
}
}
睡眠时间不是很长。您可能只是没有注意到它正在非常快速地更新字段。试着把睡眠增加到1000我不完全确定你想做什么,但我认为这正是你需要的。另外,正如其他人所说,你可能想增加睡眠时间,只是为了确保它起作用。1000毫秒怎么样
Thread t = new Thread()
{
public void run()
{
for(int i=0;i<5;i++)
{
runOnUiThread(new Runnable()
{
public void run()
{
try
{
counter.setText(""+i );
System.out.println("Value of i= "+i);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
});
sleep(100);
}
});
}
Thread t=新线程()
{
公开募捐
{
对于(inti=0;i增加睡眠时间,使变化对人眼可见
sleep(2000);
(或)将计数器的现有文本
counter.setText(counter.getText()+i);
但是你检查过你的控制台了吗?因为它一定有
i=1到4的值您应该在主线程上发布要执行的setText,它很简单,如下所示:
counter.getHandler().post(new Runnable(){public void run(){counter.setText("" + i);}});
可能是因为它每10秒就改变一次。日志输出正确的数字吗?睡眠不是以毫秒为参数吗?因为你只做了5次迭代,所以整个过程都以毫秒为单位运行500ms@MarcB是的,我在这里看到的问题是您正在UI线程上睡觉
,执行sleep()
,在工作线程上运行for循环,并使用runOnUIThread()
仅用于执行setText()
。这应该可以解决您的问题。睡眠(1000)的相同问题请参见问题。OP正在使用runOnUIThread()执行setText()
我可以在我的问题中使用处理程序吗?rununuithread
效果很好。请参阅我对该问题的评论以解决您的问题。我没有注意到rununuithread。但是向处理程序发帖会更好地安排在UI生命周期中执行Runnable。我检查了我的consle,并显示了一个真正的计数器,只是我需要在textview中,而不是在co中nsoleI尚未测试此代码,但这就是它所做的。它应该每100毫秒更新一次代码。但为了测试起见,请将其设置为1000毫秒,以便您可以看到它实际更新。
counter.getHandler().post(new Runnable(){public void run(){counter.setText("" + i);}});