异步消息处理线程

普通的线程执行完run()方法线程就会结束,异步消息处理线程是指,线程启动后会进入无限循环体中,每循环一次就会从消息队列中取出一条消息,并且回调消息处理函数。执行完一条消息后继续循环。如果消息队列为空线程就会暂停,直到消息队列中有新的消息

一般实现

  1. 每个异步线程内包含一个消息队列,先到的消息先被处理
  2. 线程的执行体中使用while(true)循环,不断的从消息队列中取出消息,并根据消息来源,回调相应的消息处理函数
  3. 外部线程可以向本线程的消息队列中发送消息,消息队列内部的读/写操作必须进行加锁,消息队列不能同时进行读写操作。

android中异步线程的实现方式

线程内部有一个或者多个Handler对象,外部程序通过handler向线程发送异步消息,消息经由handler传递到messagequeue中。线程内部只有一个messagequeue对象。线程主执行函数从messagequeue中都读取消息,并回调handler对象的handleMessage()函数。

  1. 线程局部变量(ThreadLocal),即变量的作用域是线程。从同一个线程中引用该变量,值总是相同的。
  2. Looper.prepare()方法创建了MessageQueue对象。每个looper对象都会定义一个MessageQueue对象,所以一个线程中只能有一个looper对象
  3. Looper的作用。一是为调用Looper类的prepare()函数的线程创建一个消息队列,二是提供loop()函数,使调用该函数的线程进行无限循环,并从消息队列中取出消息。
    Looper的静态函数prepare()函数中,会向线程局部存储变量中添加一个Looper对象,而looper的构造函数中会创建一个MessageQueue对象

loop()函数

public static final void loop()
     {
         Looper me=myLooper();
         MessageQueue queue=me.mQueue;
         while(true)
         {
             Message msg=queue.next();
             //.......
         }

该代码的执行流程:
先返回当前线程的Looper对象,然后进入无线循环读取消息队列消息,回调msg.target.dispatchMessage()函数,完成对消息的处理。每次处理完消息,调用msg.recycle()函数回收Message对象占用的系统资源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值