• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android的消息机制,Android消息机制

Android的消息机制,Android消息机制

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android 消息机制,android消息推送机制,android消息处理机制,android消息传递机制,android消息发送机制等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android的消息机制,Android消息机制


一、简介

  Android的消息机制主要是指Handler的运行机制,那么什么是Handler的运行机制那?通俗的来讲就是,使用Handler将子线程的Message放入主线程的Messagequeue中,在主线程使用。

二、学习内容

  学习Android的消息机制,我们需要先了解如下内容。

  平常我们接触的大多是Handler和Message,今天就让我们来深入的了解一下他们。

三、代码详解

  一般而言我们都是这样使用Handler的

  

 xxHandler.sendEmptyMessage(xxx);

  当然还有其他表示方法,但我们深入到源代码中,会发现,他们最终都调用了一个方法

 public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
        MessageQueue queue = mQueue;
        if (queue == null) {
            RuntimeException e = new RuntimeException(
                    this + " sendMessageAtTime() called with no mQueue");
            Log.w("Looper", e.getMessage(), e);
            return false;
        }
        return enqueueMessage(queue, msg, uptimeMillis);
    }

  sendMessageAtTime()方法,但这依然不是结束,我们可以看到最后一句enqueueMessage(queue, msg, uptimeMillis);按字面意思来说插入一条消息,那么疑问来了,消息插入了哪里。

  

 1   boolean enqueueMessage(Message msg, long when) {
 2         if (msg.target == null) {
 3             throw new IllegalArgumentException("Message must have a target.");
 4         }
 5         if (msg.isInUse()) {
 6             throw new IllegalStateException(msg + " This message is already in use.");
 7         }
 8 
 9         synchronized (this) {
10             if (mQuitting) {
11                 IllegalStateException e = new IllegalStateException(
12                         msg.target + " sending message to a Handler on a dead thread");
13                 Log.w(TAG, e.getMessage(), e);
14                 msg.recycle();
15                 return false;
16             }
17 
18             msg.markInUse();
19             msg.when = when;
20             Message p = mMessages;
21             boolean needWake;
22             if (p == null || when == 0 || when < p.when) {
23                 // New head, wake up the event queue if blocked.
24                 msg.next = p;
25                 mMessages = msg;
26                 needWake = mBlocked;
27             } else {
28                 // Inserted within the middle of the queue.  Usually we don't have to wake
29                 // up the event queue unless there is a barrier at the head of the queue
30                 // and the message is the earliest asynchronous message in the queue.
31                 needWake = mBlocked && p.target == null && msg.isAsynchronous();
32                 Message prev;
33                 for (;;) {
34                     prev = p;
35                     p = p.next;
36                     if (p == null || when < p.when) {
37                         break;
38                     }
39                     if (needWake && p.isAsynchronous()) {
40                         needWake = false;
41                     }
42                 }
43                 msg.next = p; // invariant: p == prev.next
44                 prev.next = msg;
45             }
46 
47             // We can assume mPtr != 0 because mQuitting is false.
48             if (needWake) {
49                 nativeWake(mPtr);
50             }
51         }
52         return true;
53     }

  进入源代码,我们发现,我们需要了解一个新类Messagequeue。

  虽然我们一般把他叫做消息队列,但是通过研究,我们发下,它实际上是一种单链表的数据结构,而我们对它的操作主要是插入和读取。

  看代码33-44,学过数据结构,我们可以轻松的看出,这是一个单链表的插入末尾的操作。

  这样就明白了,我们send方法实质就是向Messagequeue中插入这么一条消息,那么另一个问题随之而来,我们该如何处理这条消息。

  处理消息我们离不开一个重要的,Looper。那么它在消息机制中又有什么样的作用那?

  Looper扮演着消息循环的角色,具体而言它会不停的从MessageQueue中查看是否有新消息如果有新消息就会立刻处理,否则就已知阻塞在那里,现在让我们来看一下他的代码实现。

  首先是构造方法

 private Looper(boolean quitAllowed) {
        mQueue = new MessageQueue(quitAllowed);
        mThread = Thread.currentThread();
    }

      可以发现,它将当前线程对象保存了起来。我们继续

  Looper在新线程创建过程中有两个重要的方法looper.prepare() looper.loop

  

new Thread(){
    public void run(){
        Looper.prepare();
        Handler handler = new Handler();
        Looper.loop();
    }
}.start();
        

我们先来看prepare()方法

1 private static void prepare(boolean quitAllowed) {
2         if (sThreadLocal.get() != null) {
3             throw new RuntimeException("Only one Looper may be created per thread");
4         }
5         sThreadLocal.set(new Looper(quitAllowed));
6     }

咦,我们可以看到这里面又有一个ThreadLocal类,我们在这简单了解一下,他的特性,set(),get()方法。

    首先ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储后,只有在制定线程中可以获取存储的数据,对于其他线程而言则无法获取到数据。简单的来说。套用一个列子:

private ThreadLocal<Boolean> mBooleanThreadLocal = new                ThreadLocal<Boolean>();//


mBooleanThreadLocal.set(true);
Log.d(TAH,"Threadmain"+mBooleanThreadLocal.get());
new Thread("Thread#1


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android的消息机制,Android消息机制
  • Android中接收系统广播消息

相关文章

  • 2017-05-26Android特效专辑(九)——仿微信雷达搜索好友特效,逻辑清晰实现简单
  • 2017-05-26For each循环中使用remove方法。,eachremove
  • 2017-05-26Android SDK 镜像,androidsdk镜像
  • 2017-05-26Android中使用Handler以及CountDownTimer实现包含倒计时的闪屏页面,countdownview倒计时
  • 2017-05-26Linux内核系列—5.操作系统开发之特权级及特权级的转移,linux特权
  • 2017-05-26保持listview当前位置,listview当前位置
  • 2017-05-26java.lang.NoSuchFieldError: org.apache.http.message.BasicLineFormatter.INSTANCE,apachemessagequeue
  • 2017-05-26androidj基础:从网上下载图片,
  • 2017-05-26Android View事件分发机制
  • 2017-05-26AndroidStudio下使用 RecyclerView xml文件不显示预览条目并报错类似:NoClassDefFoundError 问题解决,studiorecyclerview

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • RecyclerView再封装,RecyclerView封装
    • android:ImageView选择本地图片并显示
    • Android和JavaScript相互调用的方法,androidjavascript
    • 一次奇怪的MySQL复制故障
    • Android之SystemUI加载流程和NavigationBar的分析
    • WKWebView与js交互之完美解决方案
    • 匿名社交1--登陆,匿名社交1--
    • 安卓多线程间通信和多进程之间通信有什么不同?分别怎么实现?,安卓多线程
    • 有了malloc/free,为什么还要new/delete?
    • Android特效专辑(八)——实现心型起泡飞舞的特效,让你的APP瞬间暖心

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有