mHandler = new Handler();
mHandler.post(new Runnable() {

@Override
public void run() {
text.setText(""+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// TODO Auto-generated method stub
while(i<5){
i ++;
text.setText(""+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});大家看看上面的代码,有什么问题?问什么5秒后,textview才会显示 5 而不是实时刷新?

解决方案 »

  1.   

    在每个text.setText(""+i);前面加入一行
    Log.i("Test", "现在显示:"+i);然后再运行看Log日志,就会清楚结果了。
      

  2.   

    while(i<5){
    i ++;
    text.setText(""+i);
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    你睡了5秒啊,当然5秒后显示啊
      

  3.   

    应该是跟run方法有关,线程中无法调用UI的,我的理解
      

  4.   

    不要再线程里操作UI  
    你要把信息handler出去 而不是直接在线程里进行setText
      

  5.   

    使用post方式 是将你创建的线程丢入UI线程队列进行处理,而你的线程将会被排到队列尾处,所以只有当界面 的线程队列处理完后才执行你的线程,才会导致这种情况的发生.
      

  6.   

    说简单一点,就是虽说你重新new了一个线程出来,但其实还是在UI线程里面执行的,正常情况下 如Textview这样的UI更新是不可以在非UI线程里做的,你看你现在可以更新就说明了还是在UI线程更新的,或者你可以在run方法中加上log记录Thread.currentThread().getId()就会发现其实所有的操作都是在UI线程里做的,这样的你sleep之后自然不能更新了
      

  7.   

    但是在这个前面:
    text.setText(""+i);
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }那为什么没有显示 0?
      

  8.   

    post过去的Runnable对象的run方法,实在UI线程中执行的
    在单线程的UI模型中,只有在这个线程执行一次循环后才会更新界面在你的run方法里的sleep等于是让UI线程休眠,要一直等到你的run方法执行完,UI才会得到刷新。也就是说,UI上,只能看到最后一次循环执行的结果
      

  9.   

    考虑到效率问题,几乎所有的Java UI模型都是单线程的
    awt,swing,swt,j2me,android