📒 博客首页:✎﹏ℳ๓敬坤的博客 🎈
😊 我只是一个代码的搬运工 🎃
🎉 欢迎来访的读者关注、点赞和收藏 🤞
😉有问题可以私信交流 😆
📃 文章标题:《Android入门到精通》第十六章学习笔记总结 🖍
《Android入门到精通》第十六章学习笔记总结
Handler消息传递机制
Handler类的主要两个作用
- 在任意线程中发送消息
- 在主线程中获取并处理消息
Handler类的常用方法
■ handleMessage(Message msg):处理消息的方法
■ hasMessages(int what):检查消息队列中是否包含what属性为指定值的消息
■ hasMessages(int what, Object object):检查消息UI列中是否包含what属性为指定值且object属性为指定对象的消息
■ post(Runnable r):立即发送Runnable对象,该Runnable对象最后将被封装成Message对象
■ postAtTime(Runnable r, long uptimeMillis):定时发送Runnable对象
■ postDelayed(Runnable r, long delayMillis):延迟发送Runnable对象
■ sendEmpty(int what):发送空消息
■ sendEmptyMessageDelayed(int what, long delayMillis):指定多少毫秒之后发送空消息
■ sendMessage(Message msg):立即发送消息
■ sendMessageAtTime(Message msg, long uptimeMillis):定时发送消息
■ sendMessageDelayed(Message msg, long delayMillis):延迟发送消息
■ obtainMessage():获取消息
Handler与Looper、MessageQueue
- Handler与Looper、MessageQueue的关系
■ Handler并不是单独工作的,与Handler共同工作的几个重要主要,包括Message,Looper和MessageQueue
- Message与Looper、MessageQueue的作用
■ Message:通过Handler发送、接收和处理的消息对象
■ Looper:负责管理MessageQueue。每个线程只有一个Looper,它的loop()方法负责读取MessageQueue中的消息,读取到消息之后就把消息回传给Handler进行处理
■ MessageQueue:消息队列,可以看做是一个存储消息的容器。它采用FIFO(先进先出)的原则来管理消息
- 创建Looper对象的两种创建方式
- 在主UI线程中,系统已经初始化了一个Looper对象,因此在程序中可以直接创建Handler,然后就可以通过Handler发送消息、处理消息
- 在子线程中,必须手动创建一个Looper对象,并通过loop()方法启动Looper
- 在一个线程中,只有一个Looper和MessageQueue,但是可以有多个Handler,而且这些Handler可以共享一个Looper和MessageQueue
消息类(Message)
- Message对象的属性
■ arg1:用来存放整形数据
■ arg2:用来存放整形数据
■ obj:用来存放发送给接收器的Object类型的任意对象
■ replyTo:用来指定此Message发送到任何处的可选Messenger对象
■ what:用来指定用户自定义 的消息代码,这样接受这就可以了解这个消息的信息 - 使用Message类时,需要注意以下3点
■ 尽管Message有public的默认构造方法,但是通常情况下,需要使用Message.obtain()或Handler.obtainMessage()方法从消息池中获得空消息对象,以节省资源
■ 如果一个Message只需要携带简单的int型信息,应优先使用Message.arg1和Message.arg2属性来传递消息,较之用Bundle更节省内存
■ 尽可能使用Message.what来标识信息,一边用不同方式处理Message
循环者(Looper)
- Looper的作用
■ Looper对象用来为一个线程开启一个消息循环,从而操作MessageQueue - Looper类提供的常用方法
■ prepare():用于初始化Looper
■ loop():启动Looper线程,线程会从消息队列里获取和处理消息
■ myLooper():可以获取当前线程的Looper对象
■ getThread():用于获取Looper对象所属的线程
■ quit():用于结束Looper循环