为了账号安全,请及时绑定邮箱和手机立即绑定

为什么没有添加Thread.sleep()方法,子线程更新UI不会报错?

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textView1 = (TextView) findViewById(R.id.textView1);
		new Thread(new Runnable() {
			@Override
			public void run() {
					textView1.setText("ggggggg");
			}
		}).start();
	}


正在回答

5 回答

这样说来,不加上sleep方法只是躲开了系统对子线程的追踪,才得以修改UI

0 回复 有任何疑惑可以回复我~

这个问题刚刚也遇到了,跟了下android的源码,大概分析一下。

Android 为了限制子线程更新UI, 设置了线程的检查机制,
例如从子线程对Textview.setText,
通过报错的log能看出, 抛出异常的位置是在android.view.ViewRoot.checkThread(),从字面的意思看,这个方法就是用来检查修改view的Thread是否主线程。
这个检查方法在view的requestLayout()里面被调用,但是requestLayout()有些情况下不会被调用:
if(mParent != null){
if (!mParent.isLayoutRequested()) {
mParent.requestLayout();
}
}

唯一的解释就是以上2个if中的一个不符合,导致后面的checkThread()没被调用,子线程就成功地修改了界面UI。
这个可能是在activity 被创建的初期,layout或者其他动作初始化还没有完成,导致线程的检查没有发生,具体的问题就要去研究下才知道了。

你可以试一下, 你的第一种情况,在new Thread 修改textview之前让线程睡眠2秒,这时候再来修改UI就会抛出异常了。

0 回复 有任何疑惑可以回复我~

我也是这个问题,这样岂不是可以通过子线程直接更新UI了吗?

0 回复 有任何疑惑可以回复我~

请问你知道原因了吗,我也遇到相同问题

0 回复 有任何疑惑可以回复我~

新人我不懂。

可能是因为你太帅啦

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android面试常客Handler详解
  • 参与学习       54866    人
  • 解答问题       192    个

学Android开发,必学Handler,也是Android面试常客

进入课程

为什么没有添加Thread.sleep()方法,子线程更新UI不会报错?

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号