- 浏览: 136172 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (172)
- java (172)
- c# winform 关于窗体最大化时的是否全屏效果与是否遮盖任务栏 (1)
- c# winform 只运行一个程序实例 (1)
- Shiro权限框架 (1)
- Java字节码(.class文件)的代码解析 (1)
- Hibernate、Spring和Struts工作原理及使用理由 (1)
- 基本PKG处理命令 (1)
- 最近写的代码的小结 (1)
- Dual Palindromes (1)
- 编译TortoiseSVN1.7源代码笔记 (1)
- Android项目代码混淆 (1)
- 关于就业叨咕几句 (1)
- Java重定向System.out和System.err (1)
- IHS与WAS集成插件静默安装 (1)
- 专题地图概述 (1)
- 关于MapXtreme2004附带Sample不能运行的问题 (1)
- SQL注入漏洞 (1)
- 回顾过去 展望未来(写给自己) (1)
- DB2认证考试经验谈(700&&701) (1)
- 今天用到了RM格式文件的分割工具RealProducer (1)
- 搜索引擎还是很有发展前途的 (1)
- 泰利德破解,实现学校机房免费上网 (1)
- Arduino 引言:移动互联外设传感展望 (1)
- c/c++ static 用法总结(三版本合一) (1)
- JQuery与xml的组合谈 (1)
- Android开发之消息处理机制(一)——Handler (1)
- Android开发之PopupWindow (1)
- 解析BitmapData.getPixel32()返回值因何不准确 (1)
- 关于Ext引用js的顺序问题 (1)
- Js事件大全 (1)
- 使用JavaFX2.0编写国际象棋游戏 (1)
- Hibernate/JPA常见异常分析与解决 (1)
最新评论
-
amcucn:
这排版看得
Shiro权限框架 -
WAMING5:
这也太紧凑了,眼看花了
Shiro权限框架 -
longzhun:
大虾 ,看得出你很懒啊!发个贴 这样子怎么看!!!
Shiro权限框架 -
swanky_yao:
活干的不细!!
Spring+Hibernate框架下Mysql读写分离、主从数据库配 -
饶首建:
不错,不过用处比较少吧
批处理设ip和dns
Android开发之消息处理机制(一)——Handler
<h1>Android开发之消息处理机制(一)——Handler</h1>
/*
* Android开发之消息处理机制(一)——Handler
* 北京Android俱乐部群:167839253
* Created on: 2011-8-29
* Author: blueeagle
* Email: liujiaxiang@gmail.com
*/
对于Android里的消息处理,涉及到Handler,Looper,Message,Message Queue等概念,先捋顺这些概念。
Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。
Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。
MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。
Looper:一个线程可以产生一个Looper对象,用来管理MessageQueue,它就像一个消息泵,不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。
下面来先来着重说明Handler类。
Android 里面对于异步消息的处理,提供了一套Handler的实现方案。Handler有很多适宜的应用和微妙之处,使它在和Thread以及Service等一起使用的时候达到很好的效果。
下面先看看手册里对Handler是如何定义的:
A Handler allows you to send and process <code>[url=">Message</a></code> and Runnable objects associated with a thread's<code><a href=]MessageQueue[/url]</code>. Each Handler instance is associated with a single thread and that thread's message queue.
When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue.
There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.
Handler 允许 你去发送和处理 消息或者是发送处理绑定在线程消息队列中的rannable对象,每一个Handler实例都联系到一个单一的线程和那个线程的消息队列中。当创建一个新的Handler,他将绑定到这个线程或者是创建Hanlder的线程的消息队列。从这一点上来看,它会传递信息和消息队列的rannables并在消息弹出消息队列时执行它们。Handler有两个主要的用途:1是调度消息和runnables在未来执行的时间;2是为不同线程中所进行的活动排队。
云里雾里的,但是好像隐约知道他是什么意思了。继续理解下去:这里就是多线程的问题了,当我们启动一个Android应用程序的时候,Android会首先开启一个主线程,这个主线程的工作主要就是管理界面中的UI控件,进行事件分发,处理消息响应函数等。但是如果处理一个比较耗时的操作时,比如读取本地大文档,读取网络数据等等时,如果依然用主线程的话,就会出现问题,Android系统规定默认5S无反应的话,就会弹出强制关闭对话框。
在这个时候我们就需要另外开一个线程来处理耗时的工作,这与在学习SurfaceView的时候,我们开启了一个线程去处理频繁更新的操作有些类似。但是因为子线程涉及到UI更新,而更新UI只能在主线程中更新(Android主线程不是线程安全的),子线程中操作是危险的。Handler就是用来解决这个复杂问题而出现的。Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sendMessage()方法传递)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。
如下面的例子:
在主Activity中,定义一个TextView,我们来实时的更新这个TextView的内容。
<textarea readonly name="code" class="java">package com.blueeagle;
import android.app.Activity;
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;
public class SendMessage extends Activity {
private TextView textView;
private MyHandler myHandler;//定义一个自己的Handle类
private Button button;
private MyThread m=new MyThread(); //定义一个自己的线程类
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView=(TextView)findViewById(R.id.text);
button=(Button)findViewById(R.id.startButton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
myHandler=new MyHandler();
new Thread(m).start();
System.out.println("主线程运行ID:"+Thread.currentThread().getId());
}
});
}//在对UI进行更新时,执行时所在的线程为主UI线程
class MyHandler extends Handler{//继承Handler类时,必须重写handleMessage方法
public MyHandler(){
}
public MyHandler(Looper l){
super(l);
}
@Override
public void handleMessage(Message msg) {//执行接收到的通知,此时执行的顺序是按照队列进行,即先进先出
super.handleMessage(msg);
Bundle b=msg.getData();
String textStr1=b.getString("textStr");
SendMessage.this.textView.setText(textStr1);//更改TextView中的值
}
}//该线程将会在单独的线程中运行
class MyThread implements Runnable{
int i=1;
@Override
public void run() {
while(i<11){
System.out.println("当前运行线程ID:"+Thread.currentThread().getId());
try {
Thread.sleep(1000);
}
catch(InterruptedException e){
e.printStackTrace();
}
Message msg=new Message();
Bundle b=new Bundle();
b.putString("textStr", "线程运行"+i+"次");
i++;
msg.setData(b);
SendMessage.this.myHandler.sendMessage(msg);//通过sendMessage向Handler发送更新UI的消息
}
i=1;//下次启动线程时重新计数。
}
}
} </textarea><br>
XML文件:
<textarea readonly name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button android:id="@+id/startButton" android:layout_height="wrap_content" android:text="Button" android:layout_width="wrap_content"></Button>
</LinearLayout></textarea><br>
小结:
可以看到,屏幕上的TxtView在实时变化,考察线程ID可以得知是由哪一个线程来完成这项工作的。再次点击按钮后,则会触发新的线程去执行实时更新的操作。
发表评论
-
Hibernate/JPA常见异常分析与解决
2012-02-07 17:24 14641. ClassNotFoundException: ... -
使用JavaFX2.0编写国际象棋游戏
2012-02-07 16:24 1055前面发布了不少Javafx2的教程,不觉手痒,想尝试一 ... -
Js事件大全
2012-02-04 15:34 743一般事件 事件 ... -
关于Ext引用js的顺序问题
2012-02-02 15:49 716今天自己搞了个ext的helloworld,所需的包都 ... -
解析BitmapData.getPixel32()返回值因何不准确
2012-02-02 12:29 949<div style="widt ... -
Android开发之PopupWindow
2012-01-31 13:48 1645<h1>Android开发之PopupWi ... -
JQuery与xml的组合谈
2011-12-21 17:18 767JQuery与xml的组合谈 今天谈的是XML,学ja ... -
c/c++ static 用法总结(三版本合一)
2011-12-21 10:34 778<span style="&qu ... -
Arduino 引言:移动互联外设传感展望
2011-12-20 14:08 1288作者:mznewfacer (Wolf Geek) ... -
泰利德破解,实现学校机房免费上网
2011-12-20 13:58 916泰利德破解,实现学校机房免费上网<br> ... -
搜索引擎还是很有发展前途的
2011-12-19 11:49 919相信大家已经听说,在头几天,搜狐推出了一个专业搜索门户 ... -
今天用到了RM格式文件的分割工具RealProducer
2011-12-19 09:19 663项目要加一些视频文件,这些视频都是几个老师对数据结构课 ... -
DB2认证考试经验谈(700&&701)
2011-12-16 17:17 1075很多人都通过了D ... -
回顾过去 展望未来(写给自己)
2011-12-15 16:19 1443本来想用“昨天今天明天”做标题来着,但是人家本山大叔说 ... -
SQL注入漏洞
2011-12-15 12:19 687CSDN上的ASP.NET电子杂志下载下来看,就看到了 ... -
关于MapXtreme2004附带Sample不能运行的问题
2011-12-15 10:54 642</span> -
专题地图概述
2011-12-14 12:49 798<p class="MsoNorma ... -
IHS与WAS集成插件静默安装
2011-12-14 12:04 932<span style="col ... -
Java重定向System.out和System.err
2011-12-13 14:49 1138<div>继承PrintStream类: ... -
关于就业叨咕几句
2011-12-13 11:04 605公司开始去各个学校开宣讲会了,这让我想起又到招聘的季节 ...
相关推荐
Android应用程序消息处理机制(Looper、Handler)分析
详细描述了Android的消息处理机制中,Looper和handler类详解
安卓Android源码——HandlerLooper2.rar
安卓Android源码——HandlerLooper1.rar
安卓Android源码——HandlerMessage1.rar
安卓Android源码——HandlerMessage3.rar
安卓Android源码——HandlerMessage2.rar
博客《AsnyncTask与handler(二)——handler消息机制》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/24783459
这不, 前几天为了了解android的消息处理机制, 我看 了Looper, Handler, Message这几个类的源码, 结果又一次被googler的设计震撼了, 特与大家分享。 android的消息处理有三个核心类: Looper,Handler和Message...
【Android 开发】: Android 消息处理机制之 Handler 中 sendMessage() 源代码剖析 http://blog.csdn.net/ahuier/article/details/17013647
Android多线程及异步任务消息处理机制 一 Handler的使用博文源代码 想要学习更多有关于Android的知识 请关注博客http: blog csdn net yegongheng
而Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制。实际上谷歌参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制。Android通过Looper 熟悉Windows编程的朋友可能知道Windows...
Android应用程序与传统的PC应用程序一样,都是消息驱动的。也就是说,在Android应用程序主线程中,所有函数都是在一个...掌握Android应用程序消息处理机制,有助于我们熟练地使用同步和异步编程,提高程序的运行性能
Android应用程序消息处理机制(Looper、Handler)分析[收集].pdf
博客http://blog.csdn.net/two_water/article/details/49945525里面的Demo.
NULL 博文链接:https://dingran.iteye.com/blog/1930178
【Android开发入门】Android线程之Handler
【Android 开发】: Android 消息处理机制之 Handler 与 Message http://blog.csdn.net/ahuier/article/details/17012005
Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。 Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法...