android Handler

veryitman 2012-05-31 10:40:03
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 而不是实时刷新?
...全文
171 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
RDroid 2012-06-02
  • 打赏
  • 举报
回复
考虑到效率问题,几乎所有的Java UI模型都是单线程的
awt,swing,swt,j2me,android。。。
veryitman 2012-06-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

post过去的Runnable对象的run方法,实在UI线程中执行的
在单线程的UI模型中,只有在这个线程执行一次循环后才会更新界面

在你的run方法里的sleep等于是让UI线程休眠,要一直等到你的run方法执行完,UI才会得到刷新。也就是说,UI上,只能看到最后一次循环执行的结果
[/Quote]

解释的很好!谢谢!
「已注销」 2012-06-01
  • 打赏
  • 举报
回复
post过去的Runnable对象的run方法,实在UI线程中执行的
在单线程的UI模型中,只有在这个线程执行一次循环后才会更新界面

在你的run方法里的sleep等于是让UI线程休眠,要一直等到你的run方法执行完,UI才会得到刷新。也就是说,UI上,只能看到最后一次循环执行的结果
haoyizsw 2012-06-01
  • 打赏
  • 举报
回复
不要再线程里操作UI
你要把信息handler出去 而不是直接在线程里进行setText
life02 2012-06-01
  • 打赏
  • 举报
回复
应该是跟run方法有关,线程中无法调用UI的,我的理解
life02 2012-06-01
  • 打赏
  • 举报
回复
while(i<5){
i ++;
text.setText(""+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
你睡了5秒啊,当然5秒后显示啊
thl789 2012-06-01
  • 打赏
  • 举报
回复
Thread.sleep()可不是好的用法
veryitman 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

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


但是在这个前面:
text.setText(""+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

那为什么没有显示 0?

veryitman 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

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

类似这样的回答都是错误的。我根本没有开线程!
sligner 2012-06-01
  • 打赏
  • 举报
回复
说简单一点,就是虽说你重新new了一个线程出来,但其实还是在UI线程里面执行的,正常情况下 如Textview这样的UI更新是不可以在非UI线程里做的,你看你现在可以更新就说明了还是在UI线程更新的,或者你可以在run方法中加上log记录Thread.currentThread().getId()就会发现其实所有的操作都是在UI线程里做的,这样的你sleep之后自然不能更新了
j_f0001 2012-06-01
  • 打赏
  • 举报
回复
使用post方式 是将你创建的线程丢入UI线程队列进行处理,而你的线程将会被排到队列尾处,所以只有当界面 的线程队列处理完后才执行你的线程,才会导致这种情况的发生.
AMinfo 2012-06-01
  • 打赏
  • 举报
回复
在每个text.setText(""+i);前面加入一行
Log.i("Test", "现在显示:"+i);

然后再运行看Log日志,就会清楚结果了。

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧