最基本的错误,不能在子线程中更新UI;
final TextView tv = findViewById(R.id.tv_text_view);
new Thread(){
@Override
public void run() {
try {
Thread.sleep(1000);
tv.setText("2222");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
Only the original thread that created a view hierarchy can touch its views.
解决办法
//实列话Hander 对象
Handler mHandler = new Handler();
//用Hander的post 到ui 线程执行
final TextView tv = findViewById(R.id.tv_text_view);
new Thread(){
@Override
public void run() {
try {
Thread.sleep(1000);
mHandler.post(new Runnable() {
@Override
public void run() {
tv.setText("2222");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
postDelayed
就是等待多少毫秒再执行任务, 下面例子先睡1秒,然后再延时5秒,6秒后才更新UI
final TextView tv = findViewById(R.id.tv_text_view);
new Thread(){
@Override
public void run() {
try {
Thread.sleep(1000);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
tv.setText("55555");
}
},5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
//应用程序通过ActivityThread 创建,默认创建main 线程,默认会创建一个 Looper 和一个Message 对象