一个神奇的BUG,高分悬赏 下面的run,在sleep之后,要改UI线程得用handler了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 txt.post(new Runnable() {@Overridepublic void run() {txt.setText("dddd");txt.setText("dfff");}}); 这个以前我也尝试过,个人认为是这样的:当你打开一个应用时 一般都有黑屏一下,在黑屏那一瞬间 你的onCreate开始执行,屏幕显示时 线程已经执行完了,所以没有报错。当如果你加了sleep 休眠一下 等屏幕显示好了,休眠可能还未结束 线程就无法修改主线程的UI了。如果深入研究估计要看视图显示的在窗体上 做了哪些特别的操作,以至于子线程不能修改主线程的UI。WindowManager. 我到觉得有点类似于 canvas缓冲绘图一样,在线程里面绘制好了 ,没显示的时候 用线程修改是无错误的,当你加入到窗体的时候 就不能用子线程直接修改了。 所有对于控件(Button,TextView等等)的操作,都不能直接放在子线程里操作,而要通过Handler来异步处理。你这里直接在子线程里给TextView赋值,当然会报错咯!不过有一个控件是例外的,那就是ProgressBar,不过也只是针对它独有的操作比如setMax(),setProgress()这些是可以放在子线程操作的,但是setVisibility()比如像这个是继承自View,所有的控件都有,那么依然不能放在子线程里来操作。 另外你第一句new Handler().post(null);什么都没放进去要注意通过new Handler().post(runnable)的线程,是在主线程里直接去执行这个runnable的run方法,而不是运行子线程 1、new Handler().post(null);由于放的是个null, 所以这句话毫无意义,若改成去post一个实实在在的Runnabale,像这样:new Handler().post(mRunnable);Runnable mRunnable = new Runnable() { @Override public void run() { }};如果这样的话,不管run里面是不是休眠一秒再处理ui,都不会报错,因为不会影响到ui主线程的操作。2、new 一个线程去处理ui的话,由于一秒后ui主线程已绘制完毕,再在run里面去修改ui,就会报错啦! runOnUiThread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }) new Handler().post(null);//无意义ui主线程绘制完毕,再在run里面去修改ui,就会报错 上面很多朋友都给给出了解答帮我戳一下http://vote.blog.csdn.net/blogstaritem/blogstar2013/xiaanming 为什么不sleep()就没有问题呢? 据说有这样的解释1.当onCreate的时候,UI线程还没有创建完成,在这个时候,new Thread()就是一个线程在操作UI,所以不存在线程同步的问题2.之所以不能在子程操作UI,那是因为不能在子线程操作UI线程,而在onCreate的时候,主线程还没有创建完成,这个时候只有new Thread()线程,所以new Thread()就是主线程,所以在这个时候就不存在子线程操作主线程的线程以上是在网上看到的,希望对你有所帮助。 求android4 vpnservice示例 求教各位,通过url串json数据,该怎样处理引号问题 android如何声明多个包? android编程百度地图 怎么判断程序时第一次执行? DDMS没有了 ? Android系统默认动画 救火 选择Ophone的10个理由 win7上设置Java_Home异常,SDk manager启动不了 find_java.exe -s' 不是内部或外部命令 android如何将res文件夹下的资源打包到jar中 三星平板android程序咨询 关于surfaceview的绘制
@Override
public void run() {
txt.setText("dddd");
txt.setText("dfff");
}
});
个人认为是这样的:
当你打开一个应用时 一般都有黑屏一下,在黑屏那一瞬间 你的onCreate开始执行,
屏幕显示时 线程已经执行完了,所以没有报错。
当如果你加了sleep 休眠一下 等屏幕显示好了,休眠可能还未结束 线程就无法修改主线程的UI了。
如果深入研究估计要看视图显示的在窗体上 做了哪些特别的操作,以至于子线程不能修改主线程的UI。
WindowManager.
有点类似于 canvas缓冲绘图一样,在线程里面绘制好了 ,没显示的时候 用线程修改是无错误的,
当你加入到窗体的时候 就不能用子线程直接修改了。
你这里直接在子线程里给TextView赋值,当然会报错咯!
不过有一个控件是例外的,那就是ProgressBar,不过也只是针对它独有的操作比如setMax(),setProgress()这些是可以放在子线程操作的,但是setVisibility()比如像这个是继承自View,所有的控件都有,那么依然不能放在子线程里来操作。
要注意通过new Handler().post(runnable)的线程,是在主线程里直接去执行这个runnable的run方法,而不是运行子线程
由于放的是个null, 所以这句话毫无意义,若改成去post一个实实在在的Runnabale,像这样:
new Handler().post(mRunnable);
Runnable mRunnable = new Runnable() {
@Override
public void run() {
}
};
如果这样的话,不管run里面是不是休眠一秒再处理ui,都不会报错,因为不会影响到ui主线程的操作。2、new 一个线程去处理ui的话,由于一秒后ui主线程已绘制完毕,再在run里面去修改ui,就会报错啦!
@Override
public void run() {
// TODO Auto-generated method stub
}
})
帮我戳一下http://vote.blog.csdn.net/blogstaritem/blogstar2013/xiaanming
据说有这样的解释
1.当onCreate的时候,UI线程还没有创建完成,在这个时候,new Thread()就是一个线程在操作UI,所以不存在线程同步的问题
2.之所以不能在子程操作UI,那是因为不能在子线程操作UI线程,而在onCreate的时候,主线程还没有创建完成,这个时候只有new Thread()线程,所以new Thread()就是主线程,所以在这个时候就不存在子线程操作主线程的线程以上是在网上看到的,希望对你有所帮助。