- onCreate()中更新UI,没有抛出异常哦,代码如下。
public class MainActivity extends AppCompatActivity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
new Thread(new Runnable() {
@Override
public void run() {
tv.setText("zhangjin");
}
}).start();
}
}
- 查阅资料,onCreate()执行时,ViewRootImpl还没有创建。那我们在onResume()中执行,总可以了吧?还是没有抛出异常,代码如下。
public class MainActivity extends AppCompatActivity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
}
@Override
protected void onResume() {
super.onResume();
new Thread(new Runnable() {
@Override
public void run() {
tv.setText("zhangjin");
}
}).start();
}
}
- 参考Activity启动后View何时开始绘制(onCreate中还是onResume之后?),可知,在onResume()执行后,ViewRootImpl还是没有创建。那咋办?等1秒吧。代码如下。
public class MainActivity extends AppCompatActivity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
tv.setText("zhangjin");
}
}).start();
}
}
终于出现了久违的bug:
文字版:
24698-24800/com.zj.androidthreaddemo E/AndroidRuntime: FATAL EXCEPTION: Thread-3
Process: com.zj.androidthreaddemo, PID: 24698
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:8632)
at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1380)
at android.view.View.requestLayout(View.java:23377)
at android.view.View.requestLayout(View.java:23377)
at android.view.View.requestLayout(View.java:23377)
at android.view.View.requestLayout(View.java:23377)
at android.view.View.requestLayout(View.java:23377)
at android.view.View.requestLayout(View.java:23377)
at androidx.constraintlayout.widget.ConstraintLayout.requestLayout(ConstraintLayout.java:3239)
at android.view.View.requestLayout(View.java:23377)
at android.widget.TextView.checkForRelayout(TextView.java:9221)
at android.widget.TextView.setText(TextView.java:5935)
at android.widget.TextView.setText(TextView.java:5776)
at android.widget.TextView.setText(TextView.java:5733)
at com.zj.androidthreaddemo.MainActivity$1.run(MainActivity.java:23)
at java.lang.Thread.run(Thread.java:784)
- 后续分析这个异常是怎么抛出的。