Android异步消息处理线程机制

来源:互联网 发布:c语言取反运算 编辑:程序博客网 时间:2024/06/05 07:45

Android异步消息处理线程机制

概述

普通线程:
对于一般的线程模型,执行完run()方法内的代码后线程就结束了。

异步线程:
线程启动后会进入一个无限的循环体之中,每次循环,从其内部的消息队列中取出一个消息,并回调相应的消息处理函数,执行完一个消息后继续循环。如果消息队列为空,线程会暂停,直到消息队列中有新的消息。

异步消息处理本质是仍然是一个线程,只不过这个线程的执行代码逻辑被设置成了异步线程模型所需要的。

异步线程的应用需求:

1)任务需要常驻。比如处理用户交互,网络请求处理等任务。

2)任务需要根据外部传递的消息做不同的操作。比如,根据不同消息,对不同任务的分发等

实现异步线程的一般思路

这里写图片描述

  • 每个异步线程内部包含一个消息队列(MessageQueuen),采用先到先服务机制。

  • 线程执行体使用while(true)进行无限循环,循环体中从消息队列中取出消息,回调相应的消息处理函数。

  • 其他外部线程可以向本线程的MessageQueuen中发送消息,消息队列内部读/必须进行加锁,不能同时进行读/写操作。

android中异步消息的实现

这里写图片描述

实现异步线程主要涉及到如下几个类:ThreadLocal, Looper,MessageQueue,Handler,Message。

1. ThreadLocal

作用:为线程创建一个基于线程的变量存储,称之为线程局部存储。

ThreadLocal提供了一种解决多线程同步的问题解决方案,通过为每一份变量进行拷贝,这样的话,每个线程操作的都是属于自己的变量,而不是共同的一个变量,因此也就不需要同步锁了。在Android的异步线程中,ThreadLocal绑定的这个线程变量就是Looper的一个对象。

2.Looper

Looper 是每个线程中 MessageQueue 的管家, 调用 loop() 方法后,就会进入到一个无限循环当中,然后每当发现 MessageQueue 中存在一条消息,就会将其取出,并传递到 handleMessage()方法当中。每个线程中也只会有一个Looper对象。

作用:
(1)调用prepare()函数创建一个消息队列

(2)提供loop()函数,使调用该线程的函数进行无限循环,并从消息队列中读取消息

prepare()方法:

public static final void prepare() {          if (sThreadLocal.get() != null) {              throw new RuntimeException("Only one Looper may be created per thread");          }          sThreadLocal.set(new Looper(true));  }

loop()方法:

public static void loop() {        final Looper me = myLooper();        final MessageQueue queue = me.mQueue;        while(true){               Message msg = queue.next();               if (msg != null) {                       if ( msg.target == null)                               return;                        msg.target.dispatchMessage(msg);                        msg.recycle();               }         }}

3.Handler

Handler 顾名思义也就是处理者的意思,它主要用于发送和处理消息。 发送消息一般使用 handler 的 sendMessage()方法,处理消息会调用 handleMessage() 方法。

一个线程可以包含多个Handle对象,在Looper.loop()函数中,不同的Message对应不同的Handle对象,从而回调不同的handleMessage()函数。

dispatchMessage()方法:

public void dispatchMessage(Message msg) {    if (msg.callback != null) {        handleCallback(msg);    } else {        if (mCallback != null) {            if (mCallback.handleMessage(msg)) {                return;            }        }        handleMessage(msg);    }}

4. Message

Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。 队列中的消息以链表的结构进行保存,Message对象包含next变量,该变量指向下一个消息。

5.MessageQueue

MessageQueue 是消息队列,它主要用于存放所有由 Handler 发送过来的消息,这部分消息会一直在消息队列中,等待被处理。每个线程中只会有一个 MessageQueue 对象。

小结

异步消息处理线程在Framework中被广泛使用,除了用于多线程消息传递外,它还和跨进程调用(IPC)一起被使用,用于实现异步跨进程调用。

原创粉丝点击