handler+message【消息机制】

简介: handler+message【消息机制】

handler实现

handler处理子线程无法进行耗时操作的方法就 等价于 将耗时操作通过任务的方式分配给别人,子线程中就执行了分配任务的操作(非耗时操作)。举个例子吧,大公司做一个大项目需要很长时间,但是分配给子公司就不需要干这个耗时的操作。只需要执行把任务分配给子公司,子公司做完后验收项目即可。等价于将独立完成大项目到最后只需要分配任务和审核项目操作。


🌹🌹🌹🌹🌹🌹🌹创建处理者和消息,发送数据。

Handler handler=new Handler();
Message message=new Message();
message.what=111;
message.obj=数据;//数据可以是基本类型、对象、列表、数组等
handler.sendMessage(message);

🍓🍓🍓🍓下面对handler中一些名词及相关进行解析。🍓🍓🍓🍓


Handler handler=new Handler();

Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。new Handler()相当于创建一个处理着。


Message message=new Message();

Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。new Message()相当于创建一个Message对象,存储数据为后面数据发送(任务分配)做准备


说到消息message,怎么能忘掉消息队列呢?

💕💕MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。looper下面会说


message.what=111;

这个相当于View.OnClickListener重写方法onClick(View v)的v.getId(),都是整型。image.png


下面会有使用这个,但是建议写死在一个类里面,便于项目管理。


message.obj=数据;//数据可以是基本类型、对象、列表、数组等

这句代码是正真的核心,相当于把赋值给这个message(消息对象),此时的数据类型可以是数据可以是基本类型、对象、列表、数组等


handler.sendMessage(message);

发送消息,将消息发送出去。


🌹🌹🌹🌹🌹🌹🌹重写handleMessage方法,接收数据,执行耗时操作。

@Override
    public boolean handleMessage(@NonNull Message msg) {
        switch (msg.what){
            case 111:
                Toast.makeText(LoginMainActivity.this, "登陆失败" + mEtPassWord.getText().toString().trim(), Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return false;
    }

上面的handler发送消息可以根据 message.what=111; 发送不同的数据,handleMessage可以通过switch~case 区分出来。


handler有两种方法实现,原理都一样,一个直接new,一个调用接口。两种方式可根据项目自己选择。上面说的是第一种方法,但是原理是一样的,下面总结一下

第一种,接口implementsimage.png

发送数据

Handler handler=new Handler();
Message message=new Message();
message.what=111;
message.obj=数据;//数据可以是基本类型、对象、列表、数组等
handler.sendMessage(message);

接收数据,执行耗时操作

@Override
    public boolean handleMessage(@NonNull Message msg) {
        switch (msg.what){
            case 111:
                Toast.makeText(LoginMainActivity.this, "登陆失败" + mEtPassWord.getText().toString().trim(), Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return false;
    }

第二种,new个

子线程发送数据

private void updateWeather() {  
        new Thread(new Runnable(){  
            @Override  
            public void run() {  
                //耗时操作,完成之后发送消息给Handler,完成UI更新;  
                mHandler.sendEmptyMessage(0);  
                //传递数据
                Message msg =new Message();  
                msg.obj = "数据";//数据可以是基本类型、对象、列表、数组等  
                mHandler.sendMessage(msg);  
            }  
        }).start();  
    }  

主线程接收数据

Handler mHandler = new Handler() {  
        @Override  
        public void handleMessage(Message msg) {  
            super.handleMessage(msg);  
            switch (msg.what) {  
            case 0:  
                //拿到数据,执行耗时操作 
                String data = (String)msg.obj;  
                updateWeather();  
                textView.setText(data);  
                break;  
            case 1:
            ......
            break;
            ...
            default:  
                break;  
            }  
        }  
    };  

🥭🥭2、runOnUiThread(在子线程中new一个主线程)

🥭🥭3、Looper

目录
相关文章
|
缓存 Java Shell
Handler 的 Message 实例怎么获得?为什么不是直接 new?
Handler 的 Message 实例怎么获得?为什么不是直接 new?
|
消息中间件 存储 缓存
深入理解 Handler 消息机制
深入理解 Handler 消息机制
|
消息中间件 Java Android开发
【Android 异步操作】手写 Handler ( 总结 | Message | MessageQueue | Looper | Handler ) ★(二)
【Android 异步操作】手写 Handler ( 总结 | Message | MessageQueue | Looper | Handler ) ★(二)
150 0
|
消息中间件 存储 Android开发
【Android 异步操作】手写 Handler ( 总结 | Message | MessageQueue | Looper | Handler ) ★(一)
【Android 异步操作】手写 Handler ( 总结 | Message | MessageQueue | Looper | Handler ) ★(一)
113 0
|
消息中间件 存储 Java
【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )
【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )
172 0
|
消息中间件 存储 调度
【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )(一)
【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )(一)
181 0
|
消息中间件 存储 机器学习/深度学习
【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )(二)
【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )(二)
143 0
|
机器学习/深度学习 消息中间件 Android开发
Android多线程源码详解一:handler、looper、message、messageQueue
之前面试,面试官问到多线程通讯,巴拉巴拉说了些基础实现后面试官问handlerThread的底层实现,就卡住了。所以把Android多线程的知识点复习整理一下,写出来加深印象。 Android多线程通讯的核心是handler、looper、message、messageQueue,这篇文章就先记录下这套系统的源码要点,具体的实现方法下一篇文章再写。