Android-Handle详细介绍及面试题

Android-Handle

一 什么是Handle

Handle:

A Handler allows you to send and process Message and Runnable objects associated with a thread’s MessageQueue

一个Handle是允许你去和一个线程的消息队列去发送和接收消息的对象

你可以构造handle对象来与Looper沟通,以便push新消息到messageQueue里面,或者接收Looper(从Message Queue取出)所送来的消息

如下图:

Handle特点:

Handle实例与消息处理是关联的,发送和接收要匹配

Handle只能依附在HandleThread线程

Handle可以通过设置Looper来选择其依附的线程

Handle所有的操作都是在用一个线程

Handle的removeMessage函数只能移除队列中的Message

二 作用:

1,执行计划任务

主要使用的函数是:

postAtTime,postDelayed,sendMessageAtTime,sendMessageDelayed

2,线程间通讯

在android的应用启动的时候,会创建一个主线程,主线程会创建一个消息队列来处理各种消息

当你创建子线程的时候,你可以在你的子线程中拿到福线程中创建的Handle对象

由于Android要求在UI中更新界面,所以使用的最多的情况是在子线程中更新主线程的UI

3,确保操作始终在某个特定的线程中运行

例如当我们从数据库加载数据的时候,除了程序启动时需要加载外

每当我们收到数据改变的通知时也需要重新加载为了确定数据的有效性(始终使用最后一次查询得到的数据)

并减少不必要的查询操作,我们应当确保他们在同一个线程中运行

4,用到的概念:

线程:UI Thread通常就是main Thread, 而android启动程序会替他建立一个Message Queue

message:消息

messageQueue:消息队列,用来存放线程放入的消息

Looper:相当于隧道,一个线程可以产生一个Looper对象,由他来管理县城里面的messageQueue消息队列

Looper.myLooper直接得到当前线程的Looper

looper.getMainLooper得到UI主线程的Looper

Looper的实现原理:

类似于windows编程的消息机制

在Android中接收消息队列的消息,然后分发给Handle,

在windows中分发给window

误区:Handle不一定在主线程

三 面试题:

1,多个Handle使用同一个HandleThread的时候,同一个HandleThread中可以有多个Handle吗?

yes

2,多个Handle使用同一个HandleThread的时候,同一个HandleThread中使用多个Handle的Message会混淆吗?为什么?

No,因为每个Message都有一个对应的target

不管是post还是sendMessage,最后都是调用sendMessageAtTime,在同一个线程中,同一个队列中

附上Handle的源代码,方便大家查看及分析

http://pan.baidu.com/s/1bnEuvU3

3,Handle可以创建到任意的线程中吗?

不可以,只能在Looper.onLooperPrepared中创建Handle并发送消息

4,如何指定Handle运行的线程

只要指定Handle使用的Looper就可以指定运行的线程,提高了程序的灵活性

5,同一个Handle中不同的消息会同时执行吗?

不可能交叉执行,只有处理完一条消息才会去处理下一条消息

6,对于正在执行的Message, 调用RemoveMessage会有什么后果,消息会终止吗?

不会,一旦消息发送出去,RemoveMessage就无效,removeMessage只能

移除队列中的Message

例如用户快速的点击按钮,我的程序无法有足够快的相应,该怎么办?

先调用RemoveMessage移除相同的操作

7,使用Handle是异步的,它会建立新的线程吗

不会建立,只是在新的线程中运行

8,Handle是在主线程内吗?

不一定

9,Handle的post和sendMessage使用的是一个队列还是两个?

使用的相同的一个

版权声明:欢迎交流,QQ872785786

时间: 2024-08-03 22:38:18

Android-Handle详细介绍及面试题的相关文章

Android Bitmap详细介绍(转)

转自: Bitmap详细介绍 1 package com.testbitmapscale; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.util.Iterator; 8 import com.testbitmap

Android Handler详细介绍+示例

本文主要介绍Android中Handler的使用方法,Handler跟多线程,消息队列联系很紧密,在平常的实际程序开发中比较常见.本文分为4个简单的例子. Handler使用例1 这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中. 本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s会继续启动该线程,每次线程的run函数中完成对界面输出nUpdateThread...文字,不停的运行下去,当单击End按钮时,该线程就会停止,

Android进程间通信详细介绍

1.为什么需要多个进程? 默认情况下,一个Android应用中所有的组件都会运行在以包名为进程名的单个进程中,但是由于Android自身平台的一些限制或者多进程固有的一些好处,导致很多应用在实现的时候不得不选择多进程的实现方式: 1.1. Android系统对每一个应用进程的内存占用有限制,视具体设备的情况,我的测试机的单个应用的内存限制为128M,比较大了,早期的Android设备由于总的内存大小限制,对单个应用的内存限制的比较小24M或者更小.所以如果应用需要占用很大的内存,可以考虑将一些组

Android Bitmap详细介绍(3)

package com.testbitmapscale; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import com.testbitmapscale.R.drawable; import androi

Android消息机制(Handler、MessageQueue、Looper)详细介绍

Android的消息机制其实在android的开发过程中指的也就是Handler的运行机制,这也就引出了android中常见的面试问题: 简述Handler.Looper.MessageQueue的含义,以及它们之间的关系 简述Handler的运行机制 说明Handler.Looper以及Message之间的关系 Handler机制为什么这么重要呢? 我们知道android设备作为一台移动设备,不管是内存或者还是它的性能都会受到一定的限制:过多的使用内存会使内存溢出(OOM):另外一方面,大量的

android之ListView,详细介绍实现步骤,举例,自定义listview适配器

android之ListView,详细介绍实现步骤,举例,自定义listview适配器 09. 四 / android基础 / 没有评论 本文来源于www.ifyao.com禁止转载!www.ifyao.com android中如何使用listView是比较重要的,因为很多时候都需要将数据库中的数据以列表显示, 具体使用步骤:大体 1,建立一个item.xml文件,此布局文件布局布局如何具体显示列表中的每一个条目 2,在要使用listview的界面中添加listview控件. 3,activit

如何获得Android设备名称(ADB命令详细介绍)

豌豆荚.360手机管家等软件可以获取Android设备名称,显示在界面上,如下图: 我们自己如何来获取设备名称 呢?答案如下: 在命令行中输入"adb shell"进入shell之后,再输入"cat /system/build.prop"其实,设备信息,主要是存放在"/system/build.prop"文件,通过"cat"命令就可以查看了. 下面附上ADB命令的详细介绍 adb 介绍 adb的全称为Android Debug

Android manifest之manifest标签详细介绍

AndroidManifest详细介绍 本文主要对AndroidManifest.xml文件中各个标签进行说明.索引如下: 概要PART--01 manifest标签PART--02 安全机制和permissionPART--02.01 permission标签PART--02.02 permission-group标签PART--02.03 permission-tree标签PART--02.04 uses-permission标签PART--03 instrumention标签PART--0

android 时间对话框 TimePickerDialog详细介绍

 个人在做提醒功能的时候用到了TimePickerDialog对话框,查阅了很多技术资料,但是感觉很多东西都说的不是很详细,并且很多地方,都有不完善的地方,比如有弹出对话框得到的不是系统当前的时间,而是一个其他时间的现象,让人很是苦闷.所以在经过几度研究之后,决定把个人对此空间的部分理解拿出来与大家讨论,如有不对之处,敬请谅解,会加以改进. 闲话不多说,直接进入主题: 首先,我们要在程序中声明一个日历的对象,并对其实例化获取日历实例,后面会用到. private Calendar c = C