正文
android:id
=
"@+id/rg_group"
android:layout_width
=
"match_parent"
android:layout_height
=
"30dp"
android:orientation
=
"horizontal"
app:layout_constraintTop_toTopOf
=
"parent"
>
<
RadioButton
android:id
=
"@+id/rb_test1"
android:layout_width
=
"0dp"
android:layout_height
=
"30dp"
android:layout_weight
=
"1"
android:text
=
"这是第一个radiobutton"
/>
<
RadioButton
android:layout_width
=
"0dp"
android:layout_height
=
"30dp"
android:layout_weight
=
"1"
android:text
=
"这是第二个radiobutton"
/>
RadioGroup
>
androidx.constraintlayout.widget.ConstraintLayout
>
@Override
protected void onResume() {
super.onResume();
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(5000);
mRbTest1.setText("子线程修改UI");
}
}).start();
}
这下就比较懵逼了,radioButton可以修改成功,难道radioButton做了什么特殊的处理么?随手去翻了一下radioButton的源码以及父类CompoundButton的源码,发现并没有特别之处。既然还是没找到原因,那么就debug源码看下具体的原因。
前面的流程一切正常,然后执行到checkForRelayout的时候就有问题了:
在checkForRelayout的方法里面,radioButton最终执行了invalidate方法直接return掉了。
一般我们会抛出Only the original thread that created a view hierarchy can touch its views. 这个异常是在checkThread方法里面,而checkThread是由于调用了requestLayout方法,这里没有执行requestLayout方法,自然不会崩溃。
-
那么TextView是在什么地方执行的requestLayout呢?
-
又是什么原因导致没有执行requestLayout方法呢?
我们先来看第一个问题:其实只要截图中的两个条件都没有进入就会执行requestLayout方法