android的Handler 例子
2012-04-20 11:42
113 查看
Handler类的主要作用有两个:
在新启动的线程中发送消息
在主线程中获取、处理消息
上面的说法很简单,似乎只要分成两步即可:在新启动的线程中发送消息:然后在主线程中获取、并处理消息。 但这个过程涉及一个问题:新启动的线程何时发送消息呢?
主线程何时去获取并处理消息呢?这个时机显然不好控制。 (Handler是异步消息机制)
为了让主线程能“适时”地处理新启动的线程所发送的信息,显然只能通过回调的方式来实现-----开发者只要重新Handler类中处理消息的方法,当新启动的线程发消息时,Handler类中处理消息的方法被自动回调。
Handler类包含如下方法用于发送、处理消息。
void handleMessage(Message msg): 处理消息的方法。该方法通常用于被重写
final boolean hasMessages(int what): 检查消息队列中是否包含what属性为指定值的消息。
final boolean hasMessages(int what, Object object):检查消息队列中是否包含what属性为指定值且Object属性为指定对象的消息。
多个重载的Messge obtainMessage(): 获取消息。
sendEmptyMessage(int what): 发送空消息。
final boolean sendEmptyMessageDelayed(int what, long delayMillis):指定多少毫秒之后发送空消息
final boolean sendMessage(Message msg): 立即发送消息。
final boolean sendMessageDelayed(Message msg, long delayMillis): 指定多少毫秒之后发送消息
借助上面这些方法,程序可以方便利用Handler来进行消息传递。
Android.os.Handler涉及较多的知识点,我把一些关键词列举在下面,将主要介绍Handler:
android.os.Handler 、 android.os.Handler.Callback
Looper、
Threadle、Runnable
Message、Message
queue
Handler在android里负责发送和处理消息。它的主要用途有:
1)按计划发送消息或执行某个Runnanble(使用POST方法);
2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)
默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper looper, Handler.Callback callback)可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以sendMessage。Handler对于Message的处理不是并发的。一个Looper
只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。
start~end例子
main.xml
界面图
HandlerTestActivity.java
点击start后每隔3秒打印 不点击end,就一直打印
android学习笔记之消息机制,异步和多线程
android
handler概念解释
SDK
Android
开源项目-StandupTimer学习笔记索引
在新启动的线程中发送消息
在主线程中获取、处理消息
上面的说法很简单,似乎只要分成两步即可:在新启动的线程中发送消息:然后在主线程中获取、并处理消息。 但这个过程涉及一个问题:新启动的线程何时发送消息呢?
主线程何时去获取并处理消息呢?这个时机显然不好控制。 (Handler是异步消息机制)
为了让主线程能“适时”地处理新启动的线程所发送的信息,显然只能通过回调的方式来实现-----开发者只要重新Handler类中处理消息的方法,当新启动的线程发消息时,Handler类中处理消息的方法被自动回调。
Handler类包含如下方法用于发送、处理消息。
void handleMessage(Message msg): 处理消息的方法。该方法通常用于被重写
final boolean hasMessages(int what): 检查消息队列中是否包含what属性为指定值的消息。
final boolean hasMessages(int what, Object object):检查消息队列中是否包含what属性为指定值且Object属性为指定对象的消息。
多个重载的Messge obtainMessage(): 获取消息。
sendEmptyMessage(int what): 发送空消息。
final boolean sendEmptyMessageDelayed(int what, long delayMillis):指定多少毫秒之后发送空消息
final boolean sendMessage(Message msg): 立即发送消息。
final boolean sendMessageDelayed(Message msg, long delayMillis): 指定多少毫秒之后发送消息
借助上面这些方法,程序可以方便利用Handler来进行消息传递。
关键词
Android.os.Handler涉及较多的知识点,我把一些关键词列举在下面,将主要介绍Handler:android.os.Handler 、 android.os.Handler.Callback
Looper、
Threadle、Runnable
Message、Message
queue
android.os.Handler
Handler在android里负责发送和处理消息。它的主要用途有:1)按计划发送消息或执行某个Runnanble(使用POST方法);
2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)
默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper looper, Handler.Callback callback)可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以sendMessage。Handler对于Message的处理不是并发的。一个Looper
只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。
start~end例子
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/startButton" android:layout_width = "fill_parent" android:layout_height="wrap_content" android:text="start" /> <Button android:id="@+id/endButton" android:layout_width = "fill_parent" android:layout_height= "wrap_content" android:text="end" /> </LinearLayout>
界面图
HandlerTestActivity.java
public class HandlerTestActivity extends Activity { //声明两个按钮控件 private Button startButton = null; private Button endButton = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //根据控件的ID得到代表控件的对象,并为这两个按钮设置相应的监听器 startButton = (Button)findViewById(R.id.startButton); startButton.setOnClickListener(new StartButtonListener()); endButton = (Button)findViewById(R.id.endButton); endButton.setOnClickListener(new EndButtonListener()); } class StartButtonListener implements OnClickListener{ public void onClick(View v){ //调用Handler的post方法,将要执行的线程对象添加到队列当中 handler.post(updateThread); } } class EndButtonListener implements OnClickListener{ public void onClick(View v){ handler.removeCallbacks(updateThread); } } //创建一个Handler对象 Handler handler = new Handler(); //将执行的操作写在线程对象的run方法当中 Runnable updateThread = new Runnable(){ public void run(){ System.out.println("UpdateThread"); //在run方法内部,执行postDelayed或者是post方法 handler.postDelayed(updateThread, 3000); //隔了3000毫秒再加入到队列中去, postDelayed 加入到消息队列中去 } }; }
点击start后每隔3秒打印 不点击end,就一直打印
参考文献
android学习笔记之消息机制,异步和多线程android
handler概念解释
SDK
系列索引
Android
开源项目-StandupTimer学习笔记索引
更多参考http://www.cnblogs.com/keyindex/articles/1822463.html
相关文章推荐
- Android入门(5)最简单的Handler例子
- android的Handler 例子
- Android HandlerThread例子
- Android笔记--handler的使用的一个例子
- Android中Handler小例子
- Android访问网络的常用方式:Handler、AsyncTask简单例子(服务器端+Android端)
- 疯狂android handler书上例子更正
- Android Handler简单例子
- Android——Handler学习(简单计时器例子)
- Android消息机制之四---Looper,Handler,Message例子
- Android开发之Handler使用4个例子
- Android入门(5)最简单的Handler例子
- android对handler及asynctask的一个例子
- Android入门(5)最简单的Handler例子
- android学习之通过handler更新UI的例子
- android 一个小例子说明handler和AlertDialog的简单使用
- [Android]一个简单使用Handler做Timer的例子
- Android初学习 - Handler使用的简单例子
- android基础Handler小例子
- 一个简单的例子解析android中Handler线程和普通Thread的使用