• Handler-线程间通信


    线程通信

    Handler

    获取到哪个线程的Handler,就可以给这个线程发送消息。

    Looper

    线程间通信的桥梁。

    案例

    更新UI数据

    动态更新Activity界面上面的数据。3s后,让界面上的数字每秒后增加1。

    1. UI线程创建Handler,负责接收普通线程发送的数字增加消息并更新Activity界面。
    	Handler uiHandler = null;
    	
    	public void initHandler(){
            uiHandler = new Handler(){
                @Override
                public void handleMessage(@NonNull Message msg) {
                    Log.d(TAG, String.format("[uiHandler][handleMessage]Message=%s", msg));
    
                    switch (msg.what){
                        case Config.ADD_ONE:
                            number++;
                            textView.setText(String.valueOf(number));
                            break;
                        default:
                            Log.d(TAG, String.format("[uiHandler][handleMessage]Other what of message %s", msg.what));
                            break;
                    }
                    super.handleMessage(msg);
                }
            };
        }
    
    1. 创建普通线程,使用UI线程的Handler向UI线程发送数字增加消息。
    public void startAddNumberThread(){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(3000);
                        while (true) {
                            Message message = uiHandler.obtainMessage();
                            message.what = Config.ADD_ONE;
                            uiHandler.sendMessage(message);
                            Thread.sleep(1000);
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    
    1. 实现效果。
      请添加图片描述
    2. 示例源码: handler进程通信-UpdateUIThread,有用的话敬请Star

    两个普通线程间的通信

    1. 创建两个普通线程:threadA、threadB。
    2. threadA创建后,等待1s(等threadB也完成创建),向threadB发送首条消息。
    3. threadB收到threadA的消息后,回复1条消息。
    4. threadA收到threadB回复的消息后,通信结束。
      在这里插入图片描述

    创建threadA,等待threadB创建完成后给threadB发送一条消息。

    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Looper.prepare();
                handlerA = new Handler() {
                    @Override
                    public void handleMessage(@NonNull Message msg) {
                        super.handleMessage(msg);
                        Log.d(TAG, String.format("[ThreadA][UseHandlerA][GetMessage]\t%s", msg.obj));
                    }
                };
                // wait for handlerB isn't null
                Thread.sleep(1000);
                while (handlerB==null) {
                    ;
                }
                Message msg = Message.obtain();
                msg.what = Config.THREADA;
                msg.obj = "Hi thread B, this's thread A";
                Log.d(TAG, String.format("[ThreadA][UseHandlerB][SendMessage]\t%s", msg.obj));
                handlerB.sendMessage(msg);
                //enter loop.
                Looper.loop();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
    

    创建threadB。接收threadA发送的消息后回复一条消息。

    new Thread(new Runnable() {
        @Override
        public void run() {
            Looper.prepare();
            handlerB = new Handler() {
                @Override
                public void handleMessage(@NonNull Message msg) {
                    super.handleMessage(msg);
                    Log.d(TAG, String.format("[ThreadB][UseHandlerB][GetMessage]\t%s", msg.obj));
                    Message msgB = Message.obtain();
                    msgB.what = Config.THREADA;
                    switch (msg.what) {
                        case Config.THREADA:
                            msgB.obj = "Dear thread A, i'am fine, thanks and bye.";
                            Log.d(TAG, String.format("[ThreadB][UseHandlerA][SendMessage]\t%s", msgB.obj));
                            handlerA.sendMessage(msgB);
                            break;
                    }
                }
            };
            Looper.loop();
        }
    }).start();
    

    结果输出

    [ThreadA][UseHandlerB][SendMessage] Hi thread B, this's thread A
    [ThreadB][UseHandlerB][GetMessage]  Hi thread B, this's thread A
    [ThreadB][UseHandlerA][SendMessage] Dear thread A, i'am fine, thanks and bye.
    [ThreadA][UseHandlerA][GetMessage]  Dear thread A, i'am fine, thanks and bye.
    

    源码: handler进程通信-Demo2ThreadAToThreadB,有用的话敬请Star

    参考

    【1】Android——Handler详解

  • 相关阅读:
    MyBatisPlus 入门教程,这篇很赞
    npm ERR! fatal: early EOF npm ERR! fatal: index-pack failed
    C++ Qt开发:Slider滑块条组件
    【技术干货】华为云FusionInsight MRS的自研超级调度器Superior Scheduler
    (四)模型训练保存与加载
    Python中dataclass库
    生成式预训练语言模型能否视作闭卷问答的知识库?
    《现代命令行工具指南》8. 备忘清单:让常用命令能够信手拈来 - navi
    双软认证办理流程,需要材料
    C++(17):模板嵌套类的.template及::template
  • 原文地址:https://blog.csdn.net/github_38641765/article/details/126780468