博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
handler,message,looper学习笔记
阅读量:6314 次
发布时间:2019-06-22

本文共 1788 字,大约阅读时间需要 5 分钟。

handler消息传递机制

1.循环者looper类

  一个线程对应一个looper对象,而一个looper对象又对应一个messagequeue。messagequeue用于存放message,在messagequeue中,存放的消息按照FIFO原则执行,messagequeu被封装到looper里面。

  looper对象用来为一个线程开启一个消息循环,用来操作messagequeue,默认情况下,android中断创建的线程是没有开启消息循环的,但是主线程除外,系统自动为主线程创建looper对象,开启消息队列。所以,在主线程中,运用Handler handler = new Handler();创建handler对象是不会出错的,但在子线程中创建就会有异常。

  如果想在非主线程中创建handker对象,首先需使用looper类的perpare()方法来初始化一个looper对象,然后创建这个handler,再使用looper类的loop()方法启动looper(),从消息队列中获取和处理消息。

public class LooperThread extends Thread{

  public Handler handler;

  @override

  public void run(){

  super.run();

  Looper.prepare();

  //实例化handler

  handler = new Handler(){

  public void handleMessage(Message msg){

  switch(msg.what){

    case 1:...;break;

    case 2:...;break;

}

}

};

  Message m = handler.obtainMessage(); // 获取一个消息

  m.what = 1; //设置Message的what属性

  handler.sendMessage(m);

  Looper.loop(); //启动Looper

}

}

 

在主线程中创建该线程并启动。

 

注意:写在looper.loop()之后的代码不会被执行,该函数内部是一个循环,当调用Handler.getLooper().quit()方法之后,loop()才会中止。

 

2.消息处理类Handler

两个作用:

(1)将message或runnable应用post或Runnable()方法发送到messagequeue中,在发送时,可以指定延迟时间,发送时间和要携带的bundler数据,当messagequeue循环到该message时,调用相应的handler对象的handlerMessage()方法对其进行处理。

(2)在子线程中与主线程进行通信,也就是在工作线程中与UI线程进行通信。

说明:在一个线程中,只能有一个looper和messagequeue,但可以有多个handler,handler共享一个messageQueue和looper.

 

3.Message

  消息类被存在MessageQueue中,一个messageQueue中可以包含多个Message对象,每个Message对象可以通过Message.obtain()获得或者handler.obtainMessage().

使用Message类的属性可以携带int型数据,但是如果要携带其他类型的数据,可以先将要携带的数据保存到Bundler对象中,然后通过Message类的setData()方法将其添加到Message中。

注意:

(1)尽管message有,默认的构造方法,但是通常情况下,需要使用Message.obtain()方法或者hangler.obtainMessage()方法来从消息池中获得空消息对象,以节省资源。

(2)如果一个Message只需要携带简单的int信息,应优先使用Message.arg0,和Message.arg1属性来传递消息,这笔用Bundler更省内存。

(3)尽可能使用Message.what来白哦是信息,以便用不同方式处理message.

转载于:https://www.cnblogs.com/new-comer/p/5382964.html

你可能感兴趣的文章
如何在 Ubuntu Linux 16.04 LTS 中使用多个连接加速 apt-get/apt
查看>>
《OpenACC并行编程实战》—— 导读
查看>>
机器学习:用初等数学解读逻辑回归
查看>>
Oracle原厂老兵:从负面案例看Hint的最佳使用方式
查看>>
把自己Github上的代码添加Cocoapods支持
查看>>
C语言OJ项目参考(2493)四则运算
查看>>
零基础入门深度学习(二):神经网络和反向传播算法
查看>>
find和xargs
查看>>
数据结构例程—— 交换排序之快速排序
查看>>
IOS定位服务的应用
查看>>
[SMS&WAP]实例讲解制作OTA短信来自动配置手机WAP书签[附源码]
查看>>
【工具】系统性能查看工具 dstat
查看>>
基于zepto或jquery的手机端弹出框成功,失败,加载特效
查看>>
php引用(&)
查看>>
Delphi 操作Flash D7~XE10都有 导入Activex控件 shockwave
查看>>
oracle 学习笔记之名词解释
查看>>
MySQL Cluster搭建与测试
查看>>
python数据分析画图体验
查看>>
军规15 确保集成和调用第三方APP
查看>>
Etcd和ZooKeeper,究竟谁在watch的功能表现更好?
查看>>