Android 子线程无法刷新UI界面

时间:2021-11-03 02:52:35

问题:在Android开发中,子线程无法直接更改UI界面视图的刷新

这个时候 Handler 起到了至关重要的作用.

简单来说 , Handler就是用来传递消息的.

Handler可以当成子线程与主线程的消息传送的纽带。

在安卓开发中,在子线程中无法刷新UI,是因为UI在子线程中刷新的话,是不安全的,如 多个线程刷新UI,会造成UI更新冲突,这样是不安全的。

所以,Handler的作用就来了,子线程可以通过Handler来将UI更新操作切换到主线程中执行. 话不多说 上代码:

//这里需要实现 View.OnClickListener 接口
public class Test extends AppCompatActivity implements View.OnClickListener { TextView textView; Thread myThread; Button buttonStart @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //获取文本视图
textView = findViewById(R.id.textView); //创建线程
myThread = new TimeThread(); //获取开始按钮
buttonStart = findViewById(R.id.but_start); //开始按钮单击事件
buttonStart.setOnClickListener(this); }
//重写onClick方法
@Override
public void onClick(View v) {
//判断当前按的控件
switch (v.getId()) {
case R.id.but_start:
//开启线程
myThread.start();
break;
default:
break;
}
} } public class TimeThread extends Thread {
//重写run方法
@Override
public void run() {
super.run();
//一直循环
while (true) {
try {
//每秒执行一次
Thread.sleep(1000);
Message msg = new Message();
            //
msg.what = 1;
//获取当前系统时间
Date date= new Date();
SimpleDateFormat dateFormat = new
SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String now= dateFormat.format(date);
            //把时间放入Message
msg.obj = now ;
//由Message传递给Handler 处理
myHandler.sendMessage(msg);
} catch (Exception e) {
e.printStackTrace();
break; }
}
}
} private Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
//更新文本框里的值
textView.setText((String)msg.obj);
break;
default:
break;
}
}
};