Android中Handler的作用和使用方法
本文由发表于6年前 | Android | 暂无评论 |  被围观 27,859 views+

public class
Handler
extends Object

A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. 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的基本概念

包含线程队列和消息队列,实现异步的消息处理机制,跟web开发的ajax有异曲同工之妙。

创建一个Handler对象

Handler handler = new Handler();

将要执行的操作写在线程对象的run方法当中

Runnable updateThread = new Runnable(){
	public void run(){
		handler.postDelayed(updateThread,3000);
}
}

一个点击监听事件,在handler中添加要执行的线程

Class StartButtonListener implements OnClickListener{
	public voidonClick(View v){
		//调用Handler的post方法,将要执行的线程对象添加到队列中
		handler.post(updateThread);
        }
}

一个点击监听事件,在handler中把线程移除

Class EndButtonListerger implements OnClickListener(){
	public void onClick(View v){
		handler.removeCallBacks(updateThread);
        }
}
使用Handler更新ProgressBar的方法

分别使用
updateBarHandler.post(updateThread);
updateBarHandler.sendMessage(msg);
传递线程和消息。
通过Handler的handleMessage()方法处理消息。

首先使用匿名内部类来复写Handler当中的handlerMessage方法,该方法用于接收消息

Handler updateBarHandler = new Handler(){
	public void handleMessage(Message msg){
		bar.setProgress(msg.arg1);
		updateBarHandler.post(updateThread);
        }
};

创建一个线程类,用于控制进度条的进度,该类使用匿名内部类的方式进行声明

Runnable updateThread = new Runnable(){
	int i = 0;
	public void run(){
		i = i + 10;
		Message msg = updateBarHandle.obtainMessage();
		msg.arg1 = i;
		try{
			Thread.sleep(1000);
                } catch(InterruptedException e) {
	                e.printStackTrack();
                }
                //将msg对象加入到消息队列
                updateBarHandler.sendMessage(msg);
                if( i == 100){
	                updateBarHandler.removeCallbacks(updateThread);
                }
        }
}

点击按钮事件,加入队列,启动线程

class ButtonListener implements OnClickListener{
	public void onClick(View v){
		bar.setVisibility(View.VISIBLE);
		//线程队列
		updateBarHandler.post(updateThread);
}
}
Handler中使用单独的线程

需要使用public Handler (Looper looper)
构造函数创建Handler对象。从而实现使用Looper来处理消息队列的功能。借助Bundle使用Message传递数据。

当使用
handler.post(new Runnable);
时Handler和Activity处于同一个线程当中,在同一个线程中调用run方法。
而使用
Thread t = new Thread(new Runnable());
t.start();
创建的线程和Activity处于不同的线程中


Bundle的用法

可以把Bundle看成是特殊的map,所有的key都是String类型的

在新线程当中处理消息的方法

protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);
	//打印当前线程的ID
	System.out.println(Thread.currentThread().getId());
	//生成一个HandlerThread对象,实现了Looper来处理消息队列的功能,这个类由android应用框架提供
	HandlerThread handlerThread = new HandlerThread("hanlderThread");
	//必须先调用该类的start的方法,否则该获取的Looper对象为NULL
	handlerThread.start();
	MyHanlder myHandler = new MyHandler(handlerThread.getLooper());
	Message msg = myHandler.obtainMessage();
	Bundle bundle = new Bundle();
	bundle.putString("name","arthinking");
        msg.setData(b);
	msg.sendToTarget();
}

class MyHandler extends Handler{
	public MyHandler(){}
	public MyHandler(Looper looper){
		super(looper);
        }
        //每当有消息进入消息队列时就执行这个函数对消息进行操作
        public void handleMessage(Message msg){
	        Bundle bundle = msg.getData();
	        String name = bundle.getString("name");
	        System.out.println(Thread.currentThread().getId());
	        System.out.println(name);
        }
}

(特别说明:本文部分内容是在观看marschen的Android视频教程时摘抄的笔记,感谢marschen推出的视频教程,这里也推荐给大家:http://www.marschen.com/portal.php)

除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/android-the-role-and-use-of-handler.html
关键字: ,
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2011 7/12
文章评论
    没有评论
给我留言

有人回复时邮件通知我
Android的相关文章
随机文章 本月热门 热评
1 计算机系统结构实用知识点问答题 2011/11/16
2 【转】让你的 Node.js 应用跑得更快的 10 个技巧 2014/8/31
3 web网站项目编写页面时需要注意的事项 2011/5/15
4 Javascript笔记 – Javascript中的运算符 2012/5/22
5 数据结构笔记 – 排序算法 优化冒泡排序算法 2011/9/20
6 Java Web笔记汇总 | IT宅文章归档 AD 2011/11/14 2011/11/14
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
猜您喜欢
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.