- 浏览: 503086 次
- 性别:
- 来自: 惠州
文章分类
- 全部博客 (255)
- ant (1)
- springMVC (2)
- ajax (4)
- oracle (12)
- SSH (13)
- struts1 (2)
- Hibernate (14)
- spring (5)
- jstl (1)
- 连接池 (1)
- acegi (4)
- java (17)
- jquery (11)
- div+css (4)
- drupal (1)
- php (8)
- freemaker调模板生成静态页面 (1)
- xml (1)
- json (2)
- javascript (9)
- 正则表达式 (4)
- Ext (8)
- jdbc (1)
- sql server (2)
- perl (5)
- db4o (1)
- webservice (4)
- flex (13)
- it资讯 (1)
- joomla (0)
- 设计模式 (1)
- struts2 (4)
- s2sh (8)
- linux (3)
- ejb (2)
- android旅途 (24)
- android (36)
- C/C++ (16)
- mysql (1)
最新评论
-
fengyuxing168:
IBelyService bs = IBelyService. ...
为 Android 添加 Java 层服务也就是添加自定义的aidl服务到serviceManager 通过ServiceManager.getService取 -
dengzhangtao:
"由于ActivityManagerService是 ...
binder理解 -
yzyspy:
ActivityManagerService:startHom ...
Android的Launcher成为系统中第一个启动的,也是唯一的 -
Matchstick:
使用SELECT DISTINCT alias FROM Po ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题 -
dlheart:
没看懂你什么意思啊,我遇到的问题是一对多,设了fetch = ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题
Android----Thread+Handler 线程 消息循环( 转载)
近来找了一些关于android
线程间通信的资料,整理学习了一下,并制作了一个简单的例子。
andriod
提供了 Handler
和 Looper
来满足线程间的通信。例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler
来传递的。
在 Android
,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper
,这个事android
的新 概念。我们的主线程(UI
线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handle
,我们有消息循环,就要往消息循环里
面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,消息的的处理,把这些都封装在Handle
里面,注意Handle
只是针对那 些有Looper
的线程,不管是UI
线程还是子线程,只要你有Looper
,我就可以往你的消息队列里面添加东西,并做相应的处理。
但是这里还有一点,就是只要是关于UI
相关的东西,就不能放在子线程中,因为子线程是不能操作UI
的,只能进行数据、系统等其他非UI
的操作。
在Android
,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper
,这个是android
的新概 念。我们的主线程(UI
线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handler
,我们有消息循环,就要往消息循环里
面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,把这些都封装在Handler
里面,注意Handler
只是针对那 些有Looper
的线程,不管是UI
线程还是子线程,只要你有Looper
,我就可以往你的消息队列里面添加东西,并做相应的处理。
但是这里还有一点,就是只要是关于UI
相关的东西,就不能放在子线程中,因为子线程是不能操作UI
的,只能进行数据、系统等其他非UI
的操作。
一个Handler
的创建它就会被绑定到这个线程的消息队列中,如果是在主线程创建的,那就不需要写代码来创建消息队列了,默认的消息队列会在主线程被创建。但是如果是在子线程的话,就必须在创建Handler
之前先初始化线程的消息队列。如下面的代码:
Java 代码
- class ChildThread extends Thread {
- public void run() {
- /*
- * 创建 handler 前先初始化Looper.
- */
- Looper.prepare();
- /*
- * 在子线程创建handler ,所以会绑定到子线程的消息队列中
- *
- */
- mChildHandler = new Handler() {
- public void handleMessage(Message msg) {
- /*
- * Do some expensive operations there.
- */
- }
- };
- /*
- * 启动该线程的消息队列
- */
- Looper.loop();
- }
- }
class ChildThread extends Thread {
public void run() {
/*
* 创建 handler 前先初始化Looper.
*/
Looper.prepare();
/*
* 在子线程创建handler ,所以会绑定到子线程的消息队列中
*
*/
mChildHandler = new Handler() {
public void handleMessage(Message msg) {
/*
* Do some expensive operations there.
*/
}
};
/*
* 启动该线程的消息队列
*/
Looper.loop();
}
}
当Handler
收到消息后,就会运行handleMessage(…)
的回调函数,可以在里面做一些耗时的操作。
最后完成了操作要结束子线程时,记得调用quit()
来结束消息循环队列。
mChildHandler.getLooper().quit();
下面是一个线程间通信的小例子:
Java 代码
- /**
- *
- * @author allin.dev
- * http://allin.cnblogs.com
- *
- */
- public class MainThread extends Activity {
- private static final String TAG = "MainThread";
- private Handler mMainHandler, mChildHandler;
- private TextView info;
- private Button msgBtn;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- info = (TextView) findViewById(R.id.info);
- msgBtn = (Button) findViewById(R.id.msgBtn);
- mMainHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- Log.i(TAG, "Got an incoming message from the child thread - "
- + (String) msg.obj);
- // 接收子线程的消息
- info.setText((String) msg.obj);
- }
- };
- new ChildThread().start();
- msgBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mChildHandler != null) {
- // 发送消息给子线程
- Message childMsg = mChildHandler.obtainMessage();
- childMsg.obj = mMainHandler.getLooper().getThread().getName() + " says Hello";
- mChildHandler.sendMessage(childMsg);
- Log.i(TAG, "Send a message to the child thread - " + (String)childMsg.obj);
- }
- }
- });
- }
- public void onDestroy() {
- super.onDestroy();
- Log.i(TAG, "Stop looping the child thread's message queue");
- mChildHandler.getLooper().quit();
- }
- class ChildThread extends Thread {
- private static final String CHILD_TAG = "ChildThread";
- public void run() {
- this.setName("ChildThread");
- // 初始化消息循环队列,需要在Handler 创建之前
- Looper.prepare();
- mChildHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- Log.i(CHILD_TAG, "Got an incoming message from the main thread - " + (String)msg.obj);
- try {
- // 在子线程中可以做一些耗时的工作
- sleep(100);
- Message toMain = mMainHandler.obtainMessage();
- toMain.obj = "This is " + this.getLooper().getThread().getName() +
- ". Did you send me \"" + (String)msg.obj + "\"?";
- mMainHandler.sendMessage(toMain);
- Log.i(CHILD_TAG, "Send a message to the main thread - " + (String)toMain.obj);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- };
- Log.i(CHILD_TAG, "Child handler is bound to - "+ mChildHandler.getLooper().getThread().getName());
- // 启动子线程消息循环队列
- Looper.loop();
- }
- }
- }
发表评论
-
onInterceptTouchEvent和onTouchEvent调用时序
2012-02-08 08:44 993onInterceptTouchEvent和onTouchEv ... -
Android2.2.1广播大全
2012-01-11 17:29 884Android2.2.1广播大全 博 ... -
Android Gesture Detector
2012-01-06 16:09 1163Android Gesture Detector * ... -
在程序中设置android:gravity 和 android:layout_Gravity属性
2012-01-06 10:04 1529【Android布局】在程序中 ... -
Android应用程序基础 >> 任务栈和亲属关系(Activities and Tasks)
2012-01-05 10:26 1111Android应用程序基础 >& ... -
android 中使用socket使native和framework通信
2011-09-01 10:14 1156android 中使用socket使native和frame ... -
android aidl iBinder理解
2011-06-01 11:51 2024在android中有一个程序员大量使用的操作,就是bindse ... -
Android开发者指南(6) —— AIDL
2011-05-31 10:59 1258Android开发者指南(6) —— AIDL ... -
android 线程间的通信
2011-05-20 13:22 858近来找了一些关 ... -
Android Service学习之AIDL, Parcelable和远程服务
2011-05-20 11:51 1036AIDL的作用 由于每个应用程序都 ... -
有关Android线程的学习
2011-05-20 11:20 9861. Android进程 在了解Android ... -
(转载)Android下Affinities和Task
2011-05-19 16:30 820(转载)Android下Affinities和Tas ... -
Android的Launcher成为系统中第一个启动的,也是唯一的
2011-05-12 19:38 2117Android的Launcher成为系统 ... -
Launcher的启动过程
2011-05-12 19:36 21811. Launcher的启动过程 从网络上 ... -
android中使用jni,ndk的C语言回调方法
2011-05-12 19:19 6516android中使用jni,ndk的C ... -
典型应用之——将库打进apk
2011-05-12 19:19 2840典型应用之——将库打进apk (2010-12-17 1 ... -
一个打通jni,java framework,application三层的练习
2011-05-10 10:58 1132转自:http://blogold.chinaunix ... -
android eclipse 和 源码 情况下 引用第三方jar
2011-05-10 10:55 2434android eclipse 和 源码 情况 ... -
1.系统属性获取及设置中的设置值
2011-04-21 15:04 34551.系统属性获取及设置 android.os.SystemP ... -
给应用签名 uid.system platform 权限
2011-04-21 14:58 1439在生成的apk目录下放 signapk.jar platfo ...
相关推荐
通过自定义Handler、Looper、Message.浅析Android线程间通信原理
Handler和looper详解.
handler与looper及messagequeue的简单总结
Looper和Handler实现UI线程和子线程的通信
Handler+Looper+MessageQueue
文档详细介绍了Handler实现线程间通信过程中源码的实现机制,并对其中的Looper,MessageQueue,Message对象的初始化及sendMessage()通过sendMessageDelayed()和sendMessageAtTime()过程的操作机流程
在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按...
Handler,Looper和Message的理解和练习
这次项目用到的主要是Handler Thread Looper,希望对这三者关系还不是很清楚的人能通过我的项目读懂,当然我也不敢保证一定能
消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理,在单线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件...
一个简单的andriod多线程通信的例子
Android ,Handler,Looper,Message
andriod提供了 Handler 和 Looper 来满足线程间的通信。例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的。 在Android,这里的线程分为有...
Handler,AsyncTask,Looper自定义线程使用示例,自定义线程与UI线程交互,访问UI线程控件
Android 异步处理 Handler+Looper+MessageQueue深入详解
android 多线程 looper handler的讲解,轻松学明白androd的消息机制,附有很多实例。
这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。
Andriod提供了Handler和Looper来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(Message Exchange). 1)Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的Message ...
Android Handler Looper
在《Android Handler之消息循环的深入解析》中谈到了Handler是用于操作线程内部的消息队列,所以Handler可以用来线程间通信ITC,这种方式更加安全和高效,可以大大减少同步的烦恼,甚至都可以不用syncrhonized。线程...