Android 子线程无法刷新UI界面

问题:在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; } } };
原文地址:https://www.cnblogs.com/bieyaoxiguan/p/11493740.html