子线程更新UI的方法

子线程可以使用message来传递信息给主线程,主线程是实时接收的消息队列。

了解几个概念:

UI线程:就是我们的主线程,系统在创建UI线程的时候会初始化一个Looper对象,同时也会创建一个与其关联的MessageQueue。如果执行一个超过5秒的未完成的任务,程序将弹出dailog窗口显示无响应,强制关闭。
Handler:负责消息的发送与接收并处理。如果希望Handler正常工作,在当前线程中要有一个Looper对象。
Message:Handler接收与处理的消息对象。此对象有 4个成员变量:arg1和arg2是整型, what用户定义的消息代码, obj接收任意类型的对象。
MessageQueue:消息队列,用来存放通过Handler发布的消息,按照先进先出管理Message,在初始化Looper对象时会创建一个与之关联的MessageQueue。
Looper:每个线程只能够有一个Looper,管理MessageQueue,Looper会死循环取出Message Queue的非Null Message传递给Handler并设置此Message为Null。Main线程会自动创建Looper,子线程不会自动创建Looper,需要手动创建。

首先创建一个子线程,并用message向主线程发送消息

 class MyThread extends Thread {
        Handler handler;
        @Override
        public void run() {
            super.run();
            int count = 100;
            while (count > 1) {
                try {
                    Thread.sleep(3000);         //睡眠3秒
                    Message message = new Message();
                    message.what=0;
                    handler.sendMessage(message)
//                    switch (sign){
//                        case SIGN_ZERO:
//                           message.what=SIGN_ZERO;
//                           handler.sendMessage(message);
//                            break;
//                        case SIGN_ONE:
//                            message.what=SIGN_ONE;
//                            handler.sendMessage(message);
//                            break;
//                        case SIGN_TWO:
//                            message.what=SIGN_TWO;
//                            handler.sendMessage(message);
//                            break;
//                        default:
//                            break;
//                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

//                Intent intent = new Intent("com.lishun");
//                MainActivity.this.sendBroadcast(intent);
            }
        }
    }

同时开启线程,并用handle接收message,这是写在主线程中的方法,一般写在initView中。

MyThread myThread = new MyThread();
        myThread.start();  //启动线程
        handler = new Handler(){
            @Override
            public void handleMessage(@NonNull Message msg) {  //handleMessage方法实时获得message
                super.handleMessage(msg); 
                //接收message
                switch (msg.what){
                    case SIGN_ZERO:
                        tx_search.setText("COPY"); //更新UI
                        Log.d(TAG, "handleMessage: "+msg.what);
                        break;
                    case SIGN_ONE:
                        tx_search.setText("正在copy");
                        Log.d(TAG, "handleMessage: "+msg.what);
                        break;
                    case SIGN_TWO:
                        tx_search.setText("copy完成");
                        Log.d(TAG, "handleMessage: "+msg.what);
                        Toast.makeText(MainActivity.this, "U盘已拔出", Toast.LENGTH_SHORT).show();
                        sign=SIGN_ZERO;
                        break;
                    default:
                        break;
                }
            }
        };


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值