Android异步消息处理机制完全解析

合集下载

Android系统的异步处理机制

Android系统的异步处理机制

Android系统的异步处理机制作者:王洪伟吕亚娟来源:《消费电子》2012年第07期摘要:使用Android系统的AsynTask异步处理机制,可以很好地解决在移动应用中,由于带宽有限和数据量爆增所带来的问题,极大的提高了应用的可操作性,丰富了用户的使用体验。

关键词:Android;异步机制;移动投票中图分类号:TP391 文献标识码:A 文章编号:1674-7712 (2012) 06-0093-01在省级项目《吉林地区大学生网络应用状况的研究与对策》的调研过程中,发现在大学生中,智能手机的应用已经相当普遍。

智能手机以其功能强大丰富和小巧易携等优点,已经超越了简单通讯工具的范畴,很多学生通过智能手机进行沟通交流、学习和娱乐,智能手机已经成为广大学生的不可或缺的贴身伴侣。

在对学生的网络应用状况进行调查的时候,项目组认识到通过手机进行调查,将能够更加方便的让学生进行投票,也能够更加容易的获得调查结果,因此项目组决定尝试开发基于Android智能手机的移动投票系统,作为最新的数据统计渠道。

Android系统的市场占有率达70%以上,在大学生中更是首选,基于Android系统的移动投票系统,基本可以覆盖大部分的学生。

为了避免因为移动网络带宽有限,而导致大量学生同时投票时,出现网络访问不畅、无法投票和无法实时查看投票结果的情况,应在投票系统中采用异步处理机制,以保证投票的实时性和准确性。

在Android中提供了专门的AsynTask类进行异步处理,Asyntask机制简单易用,它将所有的线程通信都封装成回调函数,调用逻辑清晰,尤其是在异步处理结束之后,有回调函数进行收尾处理,方便进行结果的统计和输出。

本文将通过实例对Android系统的AsynTask类的一部处理机制进行深入分析,以便更好的应用于移动投票系统。

一、AsynTask类的结构AsynTask类直接继承自ng.object类,主要用到的几个内部回调函数有:doInBackGround()、onPreExecute()、onPostExecute()和onProgressUpdate(),正是这几个回调函数构成了AsynTask类的使用逻辑结构。

Android 多线程和异步处理

Android 多线程和异步处理

Android 多线程和异步处理Android操作系统是基于Linux内核的,而Linux内核天生支持多线程的能力。

在Android开发中,多线程和异步处理是必不可少的技术。

本文将介绍Android多线程和异步处理的相关知识。

一、多线程概述多线程是指在一个进程中同时执行多个线程,每个线程都是独立运行的,可以完整的拥有自己的资源和运行环境。

在Android应用中,多线程的使用可以提高程序的性能和用户体验。

1.1 多线程的优点通过使用多线程,可以将一些耗时的操作和主线程分开,提高程序的响应速度。

同时,多线程还可以充分利用多核处理器的计算能力,提高程序的运行效率。

1.2 多线程的分析与设计在使用多线程时,需要充分考虑线程安全性和资源的合理分配。

可以使用线程池来管理和控制线程的创建和销毁,使得线程的创建和销毁过程更加高效。

二、Android多线程实现方式Android中提供了多种多线程的实现方式,下面将介绍几种常见的实现方式。

2.1 继承Thread类继承Thread类是一种常见的实现多线程的方式。

通过继承Thread 类并重写run方法,可以实现自定义的线程功能。

```javapublic class MyThread extends Thread{@Overridepublic void run(){// 线程执行的代码}}```2.2 实现Runnable接口实现Runnable接口是另一种实现多线程的方式。

通过实现Runnable接口并实现run方法,也可以实现自定义的线程功能。

```javapublic class MyRunnable implements Runnable{@Overridepublic void run(){// 线程执行的代码}```2.3 使用Handler实现多线程在Android开发中,我们经常需要在子线程中更新UI界面。

这时可以使用Handler来实现多线程和UI更新的交互。

Android 异步通信原理机制

Android 异步通信原理机制

Android 异步通信原理机制
handler 因为可以异步通信的特别之处,在平时开发过程中使用比较多,根据自己平时的理解和记录,将整理的handler 一些信息写出来,如果有理解不到之处,希望各位大神多多包涵,并指正。

1.handler 是一个消息分发对象。

2,.handler 的作用:完成Android 中的线程通信(数据的异步加载显示,在子线程中完成耗时操作,在子线程中加载之后通知UI 线程显示数据)
3.AsyncTask 和Handler 的区别:
相同点:完成线程的通信,实现数据的异步加载
不同点:AsyncTask 把通信涉及的所有的步骤已经全部封装好,只需要记住封装好的框架,在框架中填入对应代码即可。

【推荐下载】Android异步处理三:Handler+Looper+MessageQueue深入详解

【推荐下载】Android异步处理三:Handler+Looper+MessageQueue深入详解

Android 异步处理三:Handler+Looper+MessageQueue 深入详解2011/09/13 0 本博文地址:blog.csdn/mylzc/article/details/6771331 转载请注明出处Android 异步处理系列文章索引Android 异步处理一:使用Thread Handler 实现非UI 线程更新UI 界面Android 异步处理二:使用AsyncTask 异步更新UI 界面Android 异步处理三:Handler Looper MessageQueue 深入详解Android 异步处理四:AsyncTask 的实现原理在《Android 异步处理一:使用Thread Handler 实现非UI 线程更新UI 界面》中,我们讲到使用Thread Handler 的方式来实现界面的更新,其实是在非UI 线程发送消息到UI 线程,通知UI 线程进行界面更新,这一篇我们将深入学习Android 线程间通讯的实现原理。

概述:Android 使用消息机制实现线程间的通信,线程通过Looper 建立自己的消息循环,MessageQueue 是FIFO 的消息队列,Looper 负责从MessageQueue 中取出消息,并且分发到消息指定目标Handler 对象。

Handler 对象绑定到线程的局部变量Looper,封装了发送消息和处理消息的接口。

例子:在介绍原理之前,我们先介绍Android 线程通讯的一个例子,这个例子实现点击按钮之后从主线程发送消息hello 到另外一个名为”CustomThread”的线程。

代码下载LooperThreadActivity.javapackage com.zhuozhuo;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;public class LooperThreadActivity extends Activity{ /** Called when the activity is first created. */private final int MSG_HELLO = 0; private Handler mHandler; @Override public void onCreate(Bundle savedInstanceState) {。

深入探讨Android异步精髓Handler

深入探讨Android异步精髓Handler

深入探讨Android异步精髓Handler 前言众所周知,Android的UI是在其主线程中进行刷新的,所以Google建议开发人员切勿在主线程中进行耗时的操作否则很容易导致应用程序无响应(ANR)。

鉴于此几乎接近硬性的要求,我们常把耗时的操作(比如网络请求)置于子线程中进行;但是子线程不能直接访问UI。

至此,这个矛盾就凸显出来了:∙主线程可以刷新UI,但不能执行耗时操作∙子线程可以执行耗时操作,但是不能直接刷新UI嗯哼,那有没有一个东西可以调和并化解这个矛盾呢?当然是有的,Google采用Handler把主线程和子线程精巧地联系起来——子线程中进行耗时的业务逻辑,然后利用Handler通知主线程刷新UI。

除此以外,还有别的方式可以实现类似的操作么?答案是肯定的,我们也可以利用AsyncTask或者IntentService进行异步的操作。

这两者又是怎么做到的呢?其实,在AsyncTask和IntentService的内部亦使用了Handler实现其主要功能。

抛开这两者不谈,当我们打开Android源码的时候也随处可见Handler的身影。

所以,Handler 是Android异步操作的核心和精髓,它在众多领域发挥着极其重要甚至是不可替代的作用。

在此,对Handler的工作原理和实现机制进行系统的梳理。

ThreadLocal简介及其使用对于线程Thread大家都挺熟悉的了,但是对于ThreadLocal可能就要陌生许多了。

虽然我们对于它不太了解,但是它早在JDK1.2版本中就已问世并且被广泛的使用,比如Hibernate,EventBus,Handler都运用了ThreadLocal进行线程相关的操作。

如果单纯地从ThreadLocal这个名字来看,它带着浓浓的“本地线程”的味道;然而,喝一口之后才发现根本就不是这个味儿。

其实,ThreadLocal并不是用来操作什么本地线程而是用于实现不同线程的数据副本。

异步binder原理

异步binder原理

异步binder原理在Android 中,Binder 是用于跨进程通信的IPC(Inter-Process Communication)机制。

当谈到异步Binder 时,通常指的是Binder 中的异步消息传递机制。

这是通过使用`Handler` 和`Message` 实现的。

以下是异步Binder 的基本原理:1. Handler 和Message:在Android 中,`Handler` 是用于处理消息的机制,而`Message` 是消息的数据载体。

在异步Binder 中,每个进程都有一个`Handler` 与其相关联,用于处理异步消息。

`Message` 中包含了要发送的数据、目标`Handler` 等信息。

2. AIDL 接口:异步Binder 的使用通常涉及到AIDL(Android Interface Definition Language)接口定义。

通过AIDL,可以定义跨进程通信所需的接口方法和数据类型。

生成的AIDL 文件将在客户端和服务端之间进行通信。

3. 客户端和服务端通信流程:-客户端:-客户端通过AIDL 接口提供的方法创建一个`Message` 对象,并将其发送给服务端的`Handler`。

-客户端可以通过`Handler` 的`sendMessage` 方法发送消息,或者通过`sendXXX` 系列方法发送带有回调的异步消息。

-服务端:-服务端在`onCreate` 方法中创建一个`Handler` 对象,并处理从客户端发送过来的消息。

-服务端通过实现AIDL 接口提供的方法,执行相应的操作,然后通过客户端提供的`IBinder` 对象向客户端发送异步消息。

-客户端的`Handler` 接收到异步消息后,执行相应的回调操作。

4. 异步回调:为了在异步Binder 中实现异步回调,通常使用`Binder` 对象的`linkToDeath` 方法监听客户端的死亡(crash)事件,以便在客户端死亡时进行相应的处理。

Android开发中的网络通信和异步任务处理(七)

Android开发中的网络通信和异步任务处理在现代手机应用程序的开发中,网络通信和异步任务处理是两个至关重要的方面。

Android开发者必须熟悉如何使用网络通信来获取和发送数据,以及如何处理异步任务以确保应用程序的流畅运行。

一、网络通信网络通信是Android应用程序中一个不可或缺的功能。

通过网络通信,应用程序可以从远程服务器获取数据,向服务器发送请求等。

在Android开发中,我们可以使用一些常见的网络通信协议,如HTTP 和HTTPS,通过HTTP传输数据。

Android提供了一些内置的类和接口来实现网络通信。

最常用的类是HttpClient和HttpURLConnection。

我们可以使用这些类来发送HTTP请求并获取服务器的响应。

然而,由于Android在API 22之后不再支持HttpClient,我们更推荐使用HttpURLConnection来实现网络通信。

这个类提供了一个简单而强大的接口,可以通过一些简单的方法来发送HTTP请求。

我们可以使用URLConnection对象来建立与服务器的连接,并使用InputStream和OutputStream类来读取和写入数据。

当进行网络通信时,我们需要注意一些安全性问题。

例如,我们可以通过使用HTTPS协议来确保数据传输的安全性,以及实施一些身份验证机制来保护用户的隐私信息。

二、异步任务处理在Android开发中,异步任务处理是必不可少的。

因为网络通信和其他一些耗时操作不能在主线程中执行,否则会导致应用程序的界面无响应。

为了避免这种情况,Android引入了异步任务(AsyncTask)的概念。

异步任务是一种在后台线程中执行耗时操作的机制。

它允许我们在主线程中执行UI更新,而不会阻塞用户界面。

我们可以继承AsyncTask类来创建自己的异步任务,并重写一些关键方法,如doInBackground()、onPostExecute()等。

在doInBackground()方法中,我们可以执行一些耗时的操作,如网络通信、数据库操作等。

Android开发之异步详解(一)Thread+Handler

Android开发之异步详解(一)Thread+Handler在Android实际开发工程中经常会进行一些诸如:文件读写、访问网络等耗时的操作,这些耗时的操作是不建议放到UI线程里的。

所以我们会新开一个线程,在子线程中进行这些耗时的操作,耗时操作过程中,UI经常需要更新,但Android是不允许在子线程中修改UI 的。

所以就出现了Thread+Handler机制,Thread通过handler向主线程发送消息、传递数据,来更新UI。

下面就介绍如何通过Thread+Handler方式实现异步操作。

1. 什么是Handler消息传递机制?当一个程序第一次启动时,Android会同时启动一条主线程(MainThread),主线程主要负责处理与UI相关的事件,如用户的按键事件、用户接触屏幕的事件及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。

所以主线程通常又被叫做UI线程。

Android的消息传递机制是另一种形式的“事件处理'这种机制主要是为了解决Android 应用的多线程问题——Android平台只允许UI 线程修改Activity里的UI组件,这样就会导致新启动的线程无法动态改变界面组件的属性值。

但在实际Android应用开发中,尤其是涉及动画的游戏开发中,需要让新启动的线程周期性地改变界面组件的属性值,这就需要借助于 Handler的消息传递机制来实现了。

2. Handler 类简介Handler类的主要作用有两个:1) 在新启动的线程中发送消息。

2) 在主线程中获取、处理消息。

上面的说法看上去很简单,似乎只要分成两步即可:在新启动的线程中发送消息;然后在主线程中获取、并处理消息。

但这个过程涉及一个问题:新启动的线程何时发送消息呢?主线程何时去获取并处理消息呢?这个时机显然不好控制。

为了让主线程能“适时”地处理新启动的线程所发送的消息,显然只能通过回调的方式来实现——我们者只要重写Handler类中处理消息的方法,当新启动的线程发送消息时,消息会发送到与之关联的MessageQueue,而Handler会不断地从MessageQueue中获取并处理消息——这将导致 Handler类中处理消息的方法被回调。

Android应用程序消息处理机制(Looper、Handler)分析

Android应用程序消息处理机制(Looper、Handler)分析Android应用程序是通过消息来驱动的,系统为每一个应用程序维护一个消息队例,应用程序的主线程不断地从这个消息队例中获取消息(Looper),然后对这些消息进行处理(Handler),这样就实现了通过消息来驱动应用程序的执行,本文将详细分析Android应用程序的消息处理机制。

前面我们学习Android应用程序中的Activity启动(和)、Service启动(和)以及广播发送()时,它们都有一个共同的特点,当ActivityManagerService需要与应用程序进行并互时,如加载Activity和Service、处理广播待,会通过来知会应用程序,应用程序接收到这个请求时,它不是马上就处理这个请求,而是将这个请求封装成一个消息,然后把这个消息放在应用程序的消息队列中去,然后再通过消息循环来处理这个消息。

这样做的好处就是消息的发送方只要把消息发送到应用程序的消息队列中去就行了,它可以马上返回去处理别的事情,而不需要等待消息的接收方去处理完这个消息才返回,这样就可以提高系统的并发性。

实质上,这就是一种异步处理机制。

这样说可能还是比较笼统,我们以一文中所介绍的应用程序启动过程的一个片断来具体看看是如何这种消息处理机制的。

在这篇文章中,要启动的应用程序称为Activity,它的默认Activity是MainActivity,它是由Launcher来负责启动的,而Launcher又是通过ActivityManagerService来启动的,当ActivityManagerService为这个即将要启的应用程序准备好新的进程后,便通过一个来通知这个新的进程来加载MainActivity,如下图所示:它对应Android应用程序启动过程中的Step 30到Step 35,有兴趣的读者可以回过头去参考一文。

这里的Step 30中的scheduleLaunchActivity是ActivityManagerService通过发送过来的请求,它请求应用程序中的ActivityThread执行Step 34中的performLaunchActivity操作,即启动MainActivity的操作。

Android异步处理

上期回顾
1. 2. 3. 4.
Android UI工作方式 Handler Looper MessageQueue
异步的需要
1. ANR 问题 如果UI线程被block 超过5秒,应 用会显示 Application Not Response 对话框,应用程序容易崩溃。 2. 解决方式,异步线程执行任务, 执行完成之后更新UI
问题
AsyncTask什么情况下会崩溃?
如何改善?
AsyncTask实现方式
CORE_POOL_SIZE:核心线程数 MAXIMUM_POOL_SIZE:最大线程数 KEEP_ALIVE:空闲线程存活时间 sWorkQueue: 工作队列 sThreadFactory:线程工厂
线程池参数
corePoolSize: 线程池维护线程的最少数量 maximumPoolSize:线程池维护线程的最大 数量 keepAliveTime: 线程池维护线程所允许的 空闲时间 unit: 线程池维护线程所允许的空闲时间 的单位 workQueue: 线程池所使用的缓冲队列 handler: 线程池对拒绝任务的处理策略
线程池工作过程
1. 如果此时线程池中的数量小于corePoolSize,即使线 程池中的线程都处于空闲状态,也要创建新的线程来 处理被添加的任务。 2.如果此时线程池中的数量等于 corePoolSize,但是缓 冲队列 workQueue未满,那么任务被放入缓冲队列。 3.如果此时线程池中的数量大于corePoolSize,缓冲队 列workQueue满,并且线程池中的数量小于 maximumPoolSize,建新的线程来处理被添加的任务。 4.如果此时线程池中的数量大于corePoolSize,缓冲队 列workQueue满,并且线程池中的数量等于 maximumPoolSize,那么通过 handler所指定的策略来 处理此任务。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android异步消息处理机制完全解析,带你从源码的角度彻底理解.之前也是由于周末通宵看TI3比赛,一直没找到时间写博客,导致已经有好久没更新了。

惭愧!后面还会恢复进度,尽量保证每周都写吧。

这里也是先恭喜一下来自瑞典的Alliance战队夺得了TI3的冠军,希望明年中国战队能够虎起!开始进入正题,我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃。

相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也是早已烂熟于心,即创建一个Message对象,然后借助Handler发送出去,之后在Handler的handleMessage()方法中获得刚才发送的Message对象,然后在这里进行UI操作就不会再出现崩溃了。

这种处理方式被称为异步消息处理线程,虽然我相信大家都会用,可是你知道它背后的原理是什么样的吗?今天我们就来一起深入探究一下Handler和Message背后的秘密。

首先来看一下如何创建Handler对象。

你可能会觉得挺纳闷的,创建Handler有什么好看的呢,直接new一下不就行了?确实,不过即使只是简单new一下,还是有不少地方需要注意的,我们尝试在程序中创建两个Handler对象,一个在主线程中创建,一个在子线程中创建,代码如下所示:[java]view plaincopy1.public class MainActivity extends Activity{2.3.private Handler handler1;4.5.private Handler handler2;6.7.@Override8.protected void onCreate(Bundle savedInstanceState){9.super.onCreate(savedInstanceState);10.setContentView(yout.activity_main);11.handler1=new Handler();12.new Thread(new Runnable(){13.@Override14.public void run(){15.handler2=new Handler();16.}17.}).start();18.}19.20.}如果现在运行一下程序,你会发现,在子线程中创建的Handler是会导致程序崩溃的,提示的错误信息为Can't create handler insidethread that has not called Looper.prepare()。

说是不能在没有调用Looper.prepare()的线程中创建Handler,那我们尝试在子线程中先调用一下Looper.prepare()呢,代码如下所示:[java]view plaincopy1.new Thread(new Runnable(){2.@Override3.public void run(){4.Looper.prepare();5.handler2=new Handler();6.}7.}).start();果然这样就不会崩溃了,不过只满足于此显然是不够的,我们来看下Handler的源码,搞清楚为什么不调用Looper.prepare()就不行呢。

Handler的无参构造函数如下所示:[java]view plaincopy1.public Handler(){2.if(FIND_POTENTIAL_LEAKS){3.final Class<?extends Handler>klass=getClass();4.if((klass.isAnonymousClass()||klass.isMemberClass()||klass.isLocalClass())&&5.(klass.getModifiers()&Modifier.STATIC)==0){6.Log.w(TAG,"The following Handler class should be static or leaksmight occur:"+7.klass.getCanonicalName());8.}9.}10.mLooper=Looper.myLooper();11.if(mLooper==null){12.throw new RuntimeException(13."Can't create handler inside thread that has not called Looper.prepare()");14.}15.mQueue=mLooper.mQueue;16.mCallback=null;17.}可以看到,在第10行调用了Looper.myLooper()方法获取了一个Looper对象,如果Looper对象为空,则会抛出一个运行时异常,提示的错误正是Can't create handler inside thread that has not called Looper.prepare()!那什么时候Looper对象才可能为空呢?这就要看看Looper.myLooper()中的代码了,如下所示:[java]view plaincopy1.public static final Looper myLooper(){2.return(Looper)sThreadLocal.get();3.}这个方法非常简单,就是从sThreadLocal对象中取出Looper。

如果sThreadLocal中有Looper存在就返回Looper,如果没有Looper存在自然就返回空了。

因此你可以想象得到是在哪里给sThreadLocal设置Looper了吧,当然是Looper.prepare()方法!我们来看下它的源码:[java]view plaincopy1.public static final void prepare(){2.if(sThreadLocal.get()!=null){3.throw new RuntimeException("Only one Looper may be created per thread");4.}5.sThreadLocal.set(new Looper());6.}可以看到,首先判断sThreadLocal中是否已经存在Looper了,如果还没有则创建一个新的Looper设置进去。

这样也就完全解释了为什么我们要先调用Looper.prepare()方法,才能创建Handler对象。

同时也可以看出每个线程中最多只会有一个Looper对象。

咦?不对呀!主线程中的Handler也没有调用Looper.prepare()方法,为什么就没有崩溃呢?细心的朋友我相信都已经发现了这一点,这是由于在程序启动的时候,系统已经帮我们自动调用了Looper.prepare()方法。

查看ActivityThread中的main()方法,代码如下所示:[java]view plaincopy1.public static void main(String[]args){2.SamplingProfilerIntegration.start();3.CloseGuard.setEnabled(false);4.Environment.initForCurrentUser();5.EventLogger.setReporter(new EventLoggingReporter());6.Process.setArgV0("<pre-initialized>");7.Looper.prepareMainLooper();8.ActivityThread thread=new ActivityThread();9.thread.attach(false);10.if(sMainThreadHandler==null){11.sMainThreadHandler=thread.getHandler();12.}13.AsyncTask.init();14.if(false){15.Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG,"ActivityThread"));16.}17.Looper.loop();18.throw new RuntimeException("Main thread loop unexpectedly exited");19.}可以看到,在第7行调用了Looper.prepareMainLooper()方法,而这个方法又会再去调用Looper.prepare()方法,代码如下所示:[java]view plaincopy1.public static final void prepareMainLooper(){2.prepare();3.setMainLooper(myLooper());4.if(Process.supportsProcesses()){5.myLooper().mQueue.mQuitAllowed=false;6.}7.}因此我们应用程序的主线程中会始终存在一个Looper对象,从而不需要再手动去调用Looper.prepare()方法了。

这样基本就将Handler的创建过程完全搞明白了,总结一下就是在主线程中可以直接创建Handler对象,而在子线程中需要先调用Looper.prepare()才能创建Handler对象。

看完了如何创建Handler之后,接下来我们看一下如何发送消息,这个流程相信大家也已经非常熟悉了,new出一个Message对象,然后可以使用setData()方法或arg参数等方式为消息携带一些数据,再借助Handler将消息发送出去就可以了,示例代码如下:[java]view plaincopy1.new Thread(new Runnable(){2.@Override3.public void run(){4.Message message=new Message();5.message.arg1=1;6.Bundle bundle=new Bundle();7.bundle.putString("data","data");8.message.setData(bundle);9.handler.sendMessage(message);10.}11.}).start();可是这里Handler到底是把Message发送到哪里去了呢?为什么之后又可以在Handler的handleMessage()方法中重新得到这条Message 呢?看来又需要通过阅读源码才能解除我们心中的疑惑了,Handler 中提供了很多个发送消息的方法,其中除了sendMessageAtFrontOfQueue()方法之外,其它的发送消息方法最终都会辗转调用到sendMessageAtTime()方法中,这个方法的源码如下所示:[java]view plaincopy1.public boolean sendMessageAtTime(Message msg,long uptimeMillis)2.{3.boolean sent=false;4.MessageQueue queue=mQueue;5.if(queue!=null){6.msg.target=this;7.sent=queue.enqueueMessage(msg,uptimeMillis);8.}9.else{10.RuntimeException e=new RuntimeException(11.this+"sendMessageAtTime()called with no mQueue");12.Log.w("Looper",e.getMessage(),e);14.return sent;15.}sendMessageAtTime()方法接收两个参数,其中msg参数就是我们发送的Message对象,而uptimeMillis参数则表示发送消息的时间,它的值等于自系统开机到当前时间的毫秒数再加上延迟时间,如果你调用的不是sendMessageDelayed()方法,延迟时间就为0,然后将这两个参数都传递到MessageQueue的enqueueMessage()方法中。

相关文档
最新文档