Android 总结:Message,MessageQueue,Looper,Handler 消息机制

  • 如果Message Pool中没有可用的Message实例,

才用给定的参数创建一个Message对象。

  • 调用removeMessages()时,将Message从Message Queue中删除,同时放入到Message Pool中。

除了上面这种方式,也可以通过Handler对象的obtainMessage()获取一个Message实例。

2. MessageQueue 消息队列

存放消息的地方,每 一个线程最多只可以拥有一个 MessageQueue数据结构。

  1. 通常使用一个Looper对象对该线程的MessageQueue进行管理。

  2. 创建一个线程的时候,一般并不会自动创建其MessageQueue:

  • 主线程创建时,会创建一个默认的Looper对象,而Looper对象的创建,将自动创建一个Message Queue。

  • 其他非主线程,不会自动创建Looper,要需要的时候,通过调用prepare()函数来实现。

3. Looper 消息管理者

每一个MessageQueue都不能脱离Looper而存在,Looper对象的创建是通过prepare()函数来实现的。

/* This is a typical example of the implementation of a Looper thread,

  • using the separation of prepare() and loop()

  • to create an initial Handler to communicate with the Looper.

*/

class LooperThread extends Thread {

public Handler mHandler;

public void run() {

Looper.prepare();

mHandler = new Handler() {

public void handleMessage(Message msg) {

// process incoming messages here

}

};

Looper.loop();

}

}

每一个Looper对象和一个线程关联,通过调用Looper.myLooper()可以获得当前线程的Looper对象 。

这里写图片描述

Looper从MessageQueue中取出Message然后,交由Handler的handleMessage()进行处理。

处理完成后,调用Message.recycle()将其放入Message Pool中。

4. Handler 消息处理者

Handler负责将需要传递的信息封装成Message 。

  • 通过handler对象的sendMessage()将消息传递给Looper,继而由Looper将Message放入MessageQueue中。

  • 当Looper对象看到MessageQueue中含有Message,就将其广播出去。

该handler对象收到该消息后,调用handler对象的handleMessage()方法进行处理。

二、线程之间的消息如何进行传递

1. 主线程给自己发送Message

public class MainActivity extends Activity {

private Button btnTest;

private TextView textView;

private Handler handler;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

btnTest = (Button)this.findViewById(R.id.btn_01);

textView = (TextView)this.findViewById(R.id.view_01);

btnTest.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View arg0) {

Looper looper = Looper.getMainLooper(); //主线程的Looper对象

//这里以主线程的Looper对象创建了handler,

//所以,这个handler发送的Message会被传递给主线程的MessageQueue。

handler = new MyHandler(looper);

handler.removeMessages(0);

//构建Message对象

//第一个参数:是自己指定的message代号,方便在handler选择性地接收

//第二三个参数没有什么意义

//第四个参数需要封装的对象

Message msg = handler.obtainMessage(1,1,1,“主线程发消息了”);

handler.sendMessage(msg); //发送消息

}

});

}

class MyHandler extends Handler{

public MyHandler(Looper looper){

super(looper);

}

public void handleMessage(Message msg){

super.handleMessage(msg);

textView.setText(“我是主线程的Handler,收到了消息:”+(String)msg.obj);

}

}

}

2. 其他线程给主线程发送Message

public class MainActivity extends Activity {

private Button btnTest;

private TextView textView;

private Handler handler;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

btnTest = (Button)this.findViewById(R.id.btn_01);

textView = (TextView)this.findViewById(R.id.view_01);

btnTest.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View arg0) {

//可以看出这里启动了一个线程来操作消息的封装和发送的工作

//这样原来主线程的发送就变成了其他线程的发送,简单吧?呵呵

new MyThread().start();

}

});

}

class MyHandler extends Handler{

public MyHandler(Looper looper){

super(looper);

}

public void handleMessage(Message msg){

super.handleMessage(msg);

textView.setText(“我是主线程的Handler,收到了消息:”+(String)msg.obj);

}

}

//加了一个线程类

class MyThread extends Thread{

public void run(){

Looper looper = Looper.getMainLooper(); //主线程的Looper对象

//这里以主线程的Looper对象创建了handler,

//所以,这个handler发送的Message会被传递给主线程的MessageQueue。

handler = new MyHandler(looper);

//构建Message对象

//第一个参数:是自己指定的message代号,方便在handler选择性地接收

//第二三个参数没有什么意义

//第四个参数需要封装的对象

Message msg = handler.obtainMessage(1,1,1,“其他线程发消息了”);

handler.sendMessage(msg); //发送消息

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

总结

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

【Android高级架构视频学习资源】

Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
[外链图片转存中…(img-2J2lf5Bi-1711856441806)]

【Android高级架构视频学习资源】

Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值