android消息处理机制之2handler与looper,MessageQueue:的关系

//

Looper

  在UI主线程里面有默认有一个Looper对象来管理UI线程的各条消息,但是在自定义的实现Thread的消息循环和消息派发,缺省情况下Thread是没有这个消息循环的既没有Looper;需要主动去创建将该线程内部的message添加到messagequeue中去,让looper来进行管理添加到,然后启动Looper的消息循环loop;与外部的交互通过Handler进行;

MessageQueue

  消息队列,由Looper所持有,但是消息的添加是通过Handler进行;

  消息循环和消息队列都是属于Thread,而Handler本身并不具有Looper和MessageQueue;

但是消息系统的建立和交互,是Thread将Looper和MessageQueue交给某个Handler维护建立消息系统模型。所以消息系统模型的核心就是Looper。消息循环和消息队列都是由Looper建立的,而建立Handler的关键就是这个Looper。

  一个Thread同时可以对应多个Handler,一个Handler同时只能属于一个Thread。Handler属于哪个

Thread取决于Handler在那个Thread中建立。

  在一个Thread中Looper也是唯一的,一个Thread对应一个Looper,建立Handler的Looper来自哪个Thread,

Handler属于哪个Thread。

//================首先是让handler有一个需要looper对象的构造来看一下,在主线程里面是不是有一个looper对象。

 1  2
 3 import android.os.Bundle;
 4 import android.os.Handler;
 5 import android.os.Looper;
 6 import android.os.Message;
 7 import android.view.View;
 8 import android.widget.Button;
 9 import android.widget.TextView;
10 import android.app.Activity;
11
12 public class Main extends Activity {
13     private Button button;
14     private TextView textView;
15     private MyHandler handler;
16
17     @Override
18     protected void onCreate(Bundle savedInstanceState) {
19         super.onCreate(savedInstanceState);
20         setContentView(R.layout.main);
21         // 在activity里面有一个默认的Looper对象来处理子线程中发送的消息。
22         button = (Button) findViewById(R.id.button1);
23         textView = (TextView) findViewById(R.id.editText1);
24         // 获取looper
25         Looper looper = Looper.getMainLooper();  //
26         handler = new MyHandler(looper);   //通过这个looper传递过去
27         handler = new MyHandler();  ///这个效果和上面的效果执行上是一模一样的。
28         button.setOnClickListener(new View.OnClickListener() {
29             @Override
30             public void onClick(View v) {
31                 // TODO Auto-generated method stub
32                 new Thread(new MyThread()).start();
33             }
34         });
35     }
36
37     // 子线程
38     public class MyThread implements Runnable {
39         @Override
40         public void run() {
41             // TODO Auto-generated method stub
42             Message message = Message.obtain();
43             message.obj = "LooperMessage";
44             handler.sendMessage(message);
45         }
46     }
47
48     // 继承一个handler类
49     public class MyHandler extends Handler {
50         public MyHandler() {
51             // TODO Auto-generated constructor stub
52         }
53
54         // 定义一个带参构造方法
55         public MyHandler(Looper looper) {
56             super(looper);
57         }
58
59         @Override
60         public void handleMessage(Message msg) {
61             // TODO Auto-generated method stub
62             super.handleMessage(msg);
63             textView.setText("-接收消息-->" + msg.obj.toString());
64         }
65     }
66
67 }

//  验证只有加入到messageQueue的消息队列里面handler才可以获取,处理,分发。而这个messageQueue就是有looper进行管理的。

//这个是从UI主线想子线程中发送消息,只要将将要发送的消息加入到looper管理的messageQueue(主线程)队列中去,在同一个消息队列里面处理一个消息不就很easy吗?

 1 package com.example.handler_looper_01;
 2
 3 import android.os.Bundle;
 4 import android.os.Handler;
 5 import android.os.Looper;
 6 import android.os.Message;
 7 import android.view.View;
 8 import android.widget.Button;
 9 import android.widget.TextView;
10 import android.app.Activity;
11
12 /**
13  * 将消息从UI主线程中发送到子线程中,比较少用~~
14  *
15  * @author lpp
16  *
17  */
18 public class Main extends Activity {
19     private Button button;
20     private TextView textView;
21     private Handler handler; // 获取handler对象
22
23     @Override
24     protected void onCreate(Bundle savedInstanceState) {
25         super.onCreate(savedInstanceState);
26         setContentView(R.layout.main);
27         // 在activity里面有一个默认的Looper对象来处理子线程中发送的消息。
28         button = (Button) findViewById(R.id.button1);
29         textView = (TextView) findViewById(R.id.editText1);
30         // 启动线程
31         new Thread(new MyThread()).start();
32         button.setOnClickListener(new View.OnClickListener() {
33             @Override
34             public void onClick(View v) {
35                 Message message = Message.obtain();
36                 message.obj = "UI的message";
37                 handler.sendMessage(message);
38             }
39         });
40     }
41
42     // 子线程
43     public class MyThread implements Runnable {
44         @Override
45         public void run() {
46             // 在线程里面与activity不一样是没有looper与之进行关联。因此是无法接收到looper里面的消息!直接报错
47             Looper.prepare(); // 循环消息队列
48             // 接受Ui主线程发送过来的消息
49             handler = new Handler() {
50                 @Override
51                 public void handleMessage(Message msg) {
52                     super.handleMessage(msg);
53                     // CalledFromWrongThreadException: Only the original thread
54                     // that created a view hierarchy can touch its views.
55                     // textView.setText(msg.obj.toString()); //
56                     // 这属于在子线程中更新UI,会直接报错!
57                     System.out.println(msg.obj.toString());
58
59                 }
60             };
61             Looper.loop(); // 知道消息队列循环结束
62         }
63     }
64 }

消息循环和消息队列都是属于Thread,而Handler本身并不具有Looper和MessageQueue;

但是消息系统的建立和交互,是Thread将Looper和MessageQueue交给某个Handler维护建立消息系统模型。

  所以消息系统模型的核心就是Looper。消息循环和消息队列都是由Looper建立的,

而建立Handler的关键就是这个Looper。

  一个Thread同时可以对应多个Handler,一个Handler同时只能属于一个Thread。Handler属于哪个

Thread取决于Handler在那个Thread中建立。

  在一个Thread中Looper也是唯一的,一个Thread对应一个Looper,建立Handler的Looper来自哪个Thread,

Handler属于哪个Thread。

时间: 2024-10-26 23:00:22

android消息处理机制之2handler与looper,MessageQueue:的关系的相关文章

Android -- 消息处理机制源码分析(Looper,Handler,Message)

android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因此我没将其作为核心类.下面一一介绍: Looper Looper的字面意思是“循环者”,它被设计用来使一个普通线程变成Looper线程.所谓Looper线程就是循环工作的线程.在程序开发中(尤其是GUI开发中),我们经常会需要一个线程不断循环,一旦有新任务则执行,执行完继续等待下一个任务,这就是Lo

Android消息处理机制:源码剖析Handler、Looper,并实现图片异步加载

引言 我们在做 Android 开发时,常常需要实现异步加载图片/网页/其他.事实上,要实现异步加载,就需要实现线程间通信,而在 Android 中结合使用 Handler.Looper.Message 能够让不同的线程通信,完成异步任务.虽然 Android 官方为我们提供了 AsyncTask 类来完成异步任务,但这个类存在许多问题,并不好用,而且,AsyncTask 也是通过 Handler 和 Thread 来实现异步加载的,所以学习这方面的知识是有必要的 本文讲解思路大致如下:绘制 A

android消息处理机制原理解析

在android开发过程中相信屌丝程序员们都用过Handler来处理一些逻辑任务,比如发送延迟消息处理业务等逻辑,我们常用的图片加载缓存库ImageLoader和Picasso等内部也是通过Handler来最终有后台加载线程切换到主线程(UI线程)来更新页面的,今天就趁着离职有点儿时间就抽空的分析了下它的一点源码,在此总结出来.闲言少叙,书归正传! 先来谈谈Looper: Looper从源码上来看就是一个普通的Java类,它在消息机制中,顾名思义,就是一个消息循环的角色.有时候读源码,我习惯性的

【Android 开发】: Android 消息处理机制之一: Handler 与 Message

最近几讲内容,我们学习了Android中关于多线程的一些知识,上一讲我们讲解了异步任务 AsyncTask 的操作,Android中还提供了其他的线程操作,如Handler Message MessageQueue Looper 等模块,这些就是Android中的消息处理机制.这部分内容是Android学习过程中的重点和难点.    现在我们就来学习一下Android的消息处理,以及剖析一下相关类如Handler和Message类的源代码,同时使用他们来更新UI主线程的操作.因为Android的

Android架构分析之Android消息处理机制(二)

作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本:4.4.2 在上一篇文章中我们看了一个使用Handler处理Message消息的例子,本文我们来分析一下其背后隐藏的Android消息处理机制. 我们可能比较熟悉Windows操作系统的消息处理模型: while(GetMessage(&msg,NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 1.消息

Android消息处理机制(源码分析)

前言 虽然一直在做应用层开发,但是我们组是核心系统BSP,了解底层了解Android的运行机制还是很有必要的.就应用程序而言,Android系统中的Java应用程序和其他系统上相同,都是靠消息驱动来工作的,它们大致的工作原理如下: 1. 有一个消息队列,可以往这个消息队列中投递消息. 2. 有一个消息循环,不断从消息队列中取出消息,然后处理 . 为了更深入的理解Android的消息处理机制,这几天空闲时间,我结合<深入理解Android系统>看了Handler.Looper.Message这几

Android异步处理三:Handler+Looper+MessageQueue深入详解

Android Loop&Handle学习总结 - New Start - 博客频道 - CSDN.NET ?????? 昨晚偷懒,这篇博客只写了一个标题,今天早晨一看,还有15的阅读量.实在是对不起那些同学.......换了是我,也会BS这样的LZ吧!sorry 啦 -------------------------------------------------------------------------------------------------------------------

Android消息处理机制

文章出处:http://www.cnblogs.com/qingblog/archive/2012/06/27/2566021.html Google参考了Windows的消息处理机制,在Android系统中实现了一套类似的消息处理机制.学习Android的消息处理机制,有几个概念(类)必须了解: 1.       Message 消息,理解为线程间通讯的数据单元.例如后台线程在处理数据完毕后需要更新UI,则可发送一条包含更新信息的Message给UI线程. 2.       Message Q

7.1 基础知识Android消息处理机制

1. Android消息处理机制: Handler, MessageQueue, Looper, Thread 线程概念 : 一个应用程序运行时它的主体被称为进程, 一个进程内部可以有多个线程, 线程共享进程的资源 线程间通信 在android系统中是怎么封装通讯的,假如存在两个线程A和B,如果A线程要告诉B线程一些消息,怎么实现? A进程怎么发发消息?(1)构造消息,消息里面有数据信息和处理函数(2)发消息:这两个步骤在android源码中被封装成Handler 消息在android中被封装为