如果在Android 子线程中更新ui
发布网友
发布时间:2022-04-21 17:41
我来回答
共3个回答
热心网友
时间:2024-05-16 10:59
这个问题刚刚也遇到了,跟了下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就会抛出异常了。
热心网友
时间:2024-05-16 10:59
不是子线程不能更细UI 还是UI线程中的子线程不能直接更新UI,,你在oncreate中创建的是一个依附于主线程的子线。。而在button中创建的是一个依附于UI线程的子线程,,
热心网友
时间:2024-05-16 11:00
针对于b情况,你尝试下在类中新建一个thread,然后在button的setOnClickListener中调用,应改没有问题。如果在button的setOnClickListener,应该算是内部类了。追问谢谢您的回答。
内部类?A中onCreate中创建的匿名Thread就不是内部类吗?(鄙人java也么学好。。)