问题:在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; } } };