android线程通信之Handler

android中线程分为两种:

1)系统创建的用于处理UI界面和用户交互事件的主线程

2)自己创建的用于实现其他业务的子线程

UI中的控件是线程不安全的,只能在主线程中操作控件,不能在其他子线程中直接操作控件。

如果想在其他线程中操作主线程中的控件,只能通过发送一个消息告诉主线程去更新界面。

为了便于在线程间发送消息进行通信,android实现了Handler机制。

线程间通过Handler传递消息(Message)。Message由一个FIFO的消息队列(MessageQueue)管理。

每个线程只能有一个MessageQueue, 系统默认会为主线程创建一个,而我们自己创建的子线程却没有。

正好Looper可为我们的子线程创建一个MessageQueue。

关于Looper:

1)调用Looper.prepare()为线程创建一个消息队列,并且保证只有一个。

2)Looper.loop()是一个死循环,不断从MessageQueue取出消息分发给Handler。

关于Handler:

1)创建Handler对象时,会把handler对象与该线程的消息队列进行关联。主线程默认拥有一个系统创建的消息队列,子线程默认没有,所以子线程中创建Handler对象前必须先调用Looper.prepare()创建一个。

2)必须重写handleMessage(Message msg)方法才能处理收到的消息。

3)调用Handler对象的sendMessage(Message msg)发送消息到消息队列。

子线程中处理消息应用场景:

 1 new Thread(new Runnable() {
 2
 3     @Override
 4     public void run() {
 5
 6     // 1.调用Looper.prepare()创建消息队列
 7     Looper.prepare();
 8     // 2.创建Handler对象重写处理消息的hanleMessage()方法
 9     handler3 = new Handler() {
10
11     @Override
12     public void handleMessage(Message msg) {
13         switch (msg.what) {
14         case 3:
15             break;
16       }
17         super.handleMessage(msg);
18         }
19     };
20     // 3.调用Looper.loop()从消息队列中取消息分发给Handler;
21     Looper.loop();
22
23 }
24 }).start();              

如果需要在主线程中处理消息,则只需要创建Handler对象时重写handleMessage(), 因为主线程已经为我们创建了消息队列,所以我们不需要再调用Looper中的方法。

总结:

一个线程只能有一个消息队列(MessageQueue),一个线程可以创建多个Handler对象,他们共用该线程的一个消息队列。

系统默认会为主线程创建一个消息队列,而子线程默认没有。

1)创建Handler对象前,在子线程中必须调用Looper.prepare()为线程创建一个消息队列,主线程不需要。

2)创建Handler对象时,必须重写HandlerMessage(Message msg)回调函数用来处理Looper.loop()分发给该Handler对象的消息。

3)创建Handler对象后,在子线程中必须调用Looper.loop()从消息队列中取出消息分发给Handler对象进行处理,主线程不需要。

时间: 2024-10-10 17:00:55

android线程通信之Handler的相关文章

Android线程通信

摘要 andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的. 正文 图解: 代码示例: /** * @author allin.dev * http://allin.cnblogs.com */ public class MainThread extends Activity { private static final String TAG = "M

Android线程处理之Handler总结

上一篇为大家介绍了如何通过Handler对象把Message数据发送到主线程,我想大家一定都已经掌握了,本篇我将以一个例子的方式为大家总结一下Handler的使用,例子是通过Handler实现一个图片自动改变的效果,一般我们都是通过Viewpage来实现这个效果,不过本篇我们就一起来学习一下如何通过Handler实现这个效果吧. 开始之前我们需要准备几张用来更新切换的图片,让后把这些图片放到res下面的drawable-hdpi下就可以了.有了这些我们就可以开始我们的效果实现了: 1.布局文件:

Android线程处理之Handler

上一篇已经简单为大家介绍了一下关于Handler的使用,本篇我们就一起再来探讨一下Handler的高级使用,上一篇我们仅仅是简单的进行UI界面的更新,本篇我们来一起探讨一下如何把子线程的数据发送到主线程进行处理,对于这个问题,我想一定有很多小伙伴困扰过,其实这很简单的,我之前和大家一样感觉在从子线程发送到主线程是不可能的,不过现在可以真正否定我之前的观点了,子线程向主线程发送数据是完全没问题的.好了,废话不多说,下面我们就一起来探讨一下吧. 1.我们通过Handler和Message来完成: /

Android Handler主线程和一般线程通信的应用分析

Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作.如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会

Android主线程、子线程通信(Thread+handler)

Android是基于Java的,所以也分主线程,子线程! 主线程:实现业务逻辑.UI绘制更新.各子线程串连,类似于将军: 子线程:完成耗时(联网取数据.SD卡数据加载.后台长时间运行)操作,类似于小兵: 一.子线程向主线程发消息(Thread+handler): 1.主线程中定义Handler: Java代码   Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.h

Android线程间通信机制

当android应用程序运行时,一个主线程被创建(也称作UI线程),此线程主要负责处理UI相关的事件,由于Android采用UI单线程模型,所以只能在主线程中对UI元素进行操作,如果在非UI线程直接对UI进行了操作,则会报错,另外,对于运算量较大的操作和IO操作,我们需要新开线程来处理这些工作,以免阻塞UI线程,子线程与主线程之间是怎样进行通信的呢?此时就要采用消息循环机制(Looper)与Handler进行处理. 一.基本概念 Looper:每一个线程都可以产生一个Looper,用来管理线程的

Android线程管理——线程通信

线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用.本小节主要从以下三个方面进行分析: <Android线程管理--线程通信> <Android线程管理--ActivityThread> <Android线程管理--Thread> 一.Handler.MessageQueue.Message及Looper四者的关系 在开发A

android 36 线程通信

安卓中一个程序跑起来叫进程,进程中至少有一个主线程.主线程用于处理用户的触摸操作和将触摸操作事件分发给响应的控件.如果进行消耗时间操作,下载,磁盘读取文件,不润许在主线程操作,只能在工作线程操作.主线程向工作线程发送消息和数据,工作线程也会时时反馈给主线程.线程通信:多个线程互相收发消息和数据. 安卓规定只有主线程才能修改UI界面和控件(除了进度条可以在工作线程修改),如果工作线程想修改UI界面则只能通知主线程进行修改. Handler:句柄,手柄,遥控器,操作板. mainActivity:

Android 主线程和子线程通信问题

Android 现在不支持View在子线程中创建及调用其方法.如果要实现子线程内容更新之后,将结果及时反馈到主线程中,该如何出来呢? 可以在主线程中创建Handler来实现. 这样子线程的结果,可以通过发消息的形式,通知主线程,然后主线程中去及时更新View控件. Handler的使用方式: mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg);