MyException - 我的异常网
当前位置:我的异常网» Android » 玩转Android-组件篇-Handler的运用

玩转Android-组件篇-Handler的运用

www.MyException.Cn  网友分享于:2013-07-06  浏览:251次
玩转Android--组件篇---Handler的使用

 

public class 

Handler

extends Object

 

java.lang.Object

 *android.os.Handler

直接子类:

AsyncQueryHandler:一个帮助你处理异步ContentResolver查询的类

AsyncQueryHandler.WorkerHandler

HttpAuthHandler:Http认证要求用户界面必须处理

SslErrorHandler:SslErrorHandler.class负责处理SSL错误的类

 

一个Handler允许你发送和处理和线程的消息队列有关的消息和Runnable对象,每个线程实例都与一个单独的

线程和线程的消息队列有关,当你创建了一个新的Handler(句柄),它必然会创建一个thread/Message队列,

从这一点上,它会传送消息和Ruuuable到消息队列,并执行它们,因为它们从消息队列出来

 

使用Handler有两个主要的用途:

(1)在以后的某个点执行计划的messages和runnables

(2)在你自己所在线程不同的线程中进入一个action并执行

 

计划好的消息可以用 post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long),

sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), 

和 sendMessageDelayed(Message, long) 这些方法。在后期的版本中允许插入一个Runnable对象

(当你接受到由message队列调用的对象);sendMessage函数允许你通过Handler的handleMessage(Message)

方法(要求你实现一个Handler的子类)来插入一个包含捆绑的数据的消息对象。

 

当发送消息的时候,你可以允许这些在消息队列中的item尽快的被处理,或者在被处理或者指定的时间内被

处理之前设置一个延迟,后两个允许你实现超时和其他时序行为。

 

当应用程序创建一个进程,它的主线程专门用于运行管理顶层的应用程序对象(活动,广播接收机等)和

他们所创建的任何床空的消息队列。您可以创建自己的线程,通过Handler来与你的主应用程序进行沟通。、

这是在post()和sendMessage()方法被调用之前要做的,而不是从你的新线程开始。计划的runnable和

message在适当的时候就会在Handler的message队列中并且被处理。

 

概览:

 

interface Handler.Callback :回调接口,你而已实例化一个Handler来避免不得不实现你子类的Handler

 

公共构造方法

---------------

 

Handler():当前线程在队列中与handler关联的默认构造方法
Handler(Handler.Callback callback):当前线程和通过处理消息而得到的回调接口关联的构造方法
Handler(Looper looper):使用提供的这个队列替换默认的那一个
Handler(Looper looper,Handler.Callback callback):使用提供的这个队列替换默认的那一个并且通过处理消息而的得到一个回调接口

 

 

公共方法:

 

 

 

public void dispatchMessage (Message msg)

处理系统信息

 

public final void dump (Printer pw, String prefix)

 

public final Looper  getLooper ()

 

public void handleMessage (Message msg)

子类必须implements它才能接收消息

 

public final boolean hasMessages (int what, Object object)

检查在发送消息期间是否在消息队列中有'what'和目标是'object'

public final boolean hasMessages (int what)

检查在消息发送期间是否在消息队列中有'what'

 

public final Message  obtainMessage (int what, int arg1, int arg2)

就像objectMessage()一样,除了它还要设置what,arg1,arg2等几个返回的参数

 

参数
what arg1 arg2
返回值传递给Message.what
返回值传递给Message.arg1
返回值传递给Message.arg2
Returns
  • 一个来自全局消息池的消息

public final Message  obtainMessage ()

从全局消息池返回一个新的消息。被创建和分配一个实例更有效。得到的消息通过handler设置这个实例
(Message.target == this),如果你不想这么做的话,可以调用Message.obtain()方法取代

public final Message  obtainMessage (int what, int arg1, int arg2, Object obj)

类似于obtainMessage(),除了要设置what,object,arg1,arg2这几个返回值
参数
what arg1 arg2 obj
返回值传递给 Message.what
返回值传递给 Message.arg1 
返回值传递给 Message.arg2 
返回值传递给 Message.obj 
Returns
  • 一个从公共消息池中得到的消息

public final Message  obtainMessage (int what)

类似于obtainMessage(),除了需要返回一个what参数

 

 

public final Message  obtainMessage (int what, Object obj)


public final boolean post (Runnable r)

将Runnable对象r添加到消息队列中,它会运行在吸附在handler上的线程运行
Parameters
r
可以被执行的Runnable对象
Returns
  • 如果Runnable对象成功插入到消息队列中就返回true. 如果失败返回false,一般是因为退出了循环处理消息队列

public final boolean postAtFrontOfQueue (Runnable r)

向实现了Runnable接口的对象发送一个消息。使得Runnable对象r能够在消息队列的下一个迭代中继续执行。
这个方法只能在非常特殊的情况下才有用---它很容易饿死在消息队列中,导致排序问题或者其他难以预料的负面影响
Parameters
r
The Runnable that will be executed.
Returns
  • Returns true if the message was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting.

public final boolean postAtTime (Runnable r, Object token, long uptimeMillis)

使Runnable对象r插入到消息队列中,通过uptimeMillis参数使其运行在一个特定的时间点上。时序是updateMillis().

Returns
  • 如果能成功添加到消息队列返回true,失败返回false,通常是因为退出了循环处理消息队列。注意,返回true并不代表Runnable对象可与被处理---如果如果超过了传送时间的户,消息就会被放弃,循环退出

public final boolean postAtTime (Runnable r, long uptimeMillis)


public final boolean postDelayed (Runnable r, long delayMillis)

 

public final void removeCallbacks (Runnable r)

移除那些在消息队列等待的对象.

public final void removeCallbacks (Runnable r, Object token)

public final void removeCallbacksAndMessages (Object token)

public final void removeMessages (int what)

移除那些在消息队列中以'what'所指向的消息

 

public final void removeMessages (int what, Object object)

移除那些在消息队列中以'what'所指向的消息和目标为'object'的对象

 

public final boolean sendEmptyMessage (int what)

发送一个带有what参数的消息
Returns
  • 如果消息成功的被放置到了消息队列,返回true,如果失败返回false,通常是由于退出了循环处理消息队列

public final boolean sendEmptyMessageAtTime (int what, long uptimeMillis)

发送一个带有what参数的消息,在一个特定的时间点uptimeMillis时

public final boolean sendEmptyMessageDelayed (int what, long delayMillis)

发送一个带有what参数的消息,在delayMillis时间时候发送

public final boolean sendMessage (Message msg)

在当前时间内所有的等待消息的消息队尾插入一个消息,它将会在handleMessage(Message)中接收到,在附有handler的线程

public final boolean sendMessageAtFrontOfQueue (Message msg)

public boolean sendMessageAtTime (Message msg, long uptimeMillis)

public final boolean sendMessageDelayed (Message msg, long delayMillis)

 

上面全是理论性的东西,而且不一定全看懂,现在用一个实例来演示一下它的作用

package com.loulijun.handlertest;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class HandlerTestActivity extends Activity {
    private Button start;
    ProgressDialog dialog = null;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        dialog = new ProgressDialog(HandlerTestActivity.this);
    	dialog.setTitle("下载文件");
    	dialog.setMessage("正在下载中...");
    	dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    	dialog.setIcon(android.R.drawable.ic_input_add);
    	dialog.setIndeterminate(false);
    	dialog.setCancelable(true);
        
        start = (Button)findViewById(R.id.start);
        start.setOnClickListener(new Button.OnClickListener()
        {

			public void onClick(View v) {
				dialog.show();
				handler.post(updateThread);
			}
        	
        });
    }
    
    Handler handler = new Handler()
    {
    	public void handleMessage(Message msg)
    	{
    		dialog.setProgress(msg.arg1);
    		handler.post(updateThread);
    	}
    };
    
    Runnable updateThread = new Runnable()
    {
    	int i = 0;
    	public void run()
    	{
    		i = i + 1;
    		Message msg = handler.obtainMessage();
    		msg.arg1 = i;
    		try
    		{
    			Thread.sleep(100);
    		}catch(InterruptedException e)
    		{
    			e.printStackTrace();
    		}
    		
    		handler.sendMessage(msg);
    		if( i == 100)
    		{
    			handler.removeCallbacks(updateThread);
    			dialog.dismiss();
    			Toast.makeText(getApplicationContext(), "下载完成!", Toast.LENGTH_SHORT).show();
    		}
    	}
    };
}
分析:
程序中定义了一个Button和一个ProgressDialog,ProgressDialog是在源代码中实现的,一开始是不显示的,当用户点击
“下载文件”这个按钮但时候,首先将ProgressDialog显示出来,然后用handler往线程队列中压入一个线程updateThread,此时updateThread启动,它是用Runnable来实现的,先定义了一个变量i=0,执行run方法后开始让i的值自增长,并将Message对象压入消息队列,通过hander调用obtainMessage()得到消息,然后为msg对象设置值,线程中设置sleep()的值为100,即每隔0.1秒就执行一次,并通过handler调用sendMessage(msg)方法将消息发送出去,由handleMessage(Message msg)方法得到消息,设置进度条值,就这样连续执行,知道i=100的时候,将updateThread从线程队列中移除,并显示下载完成。

 运行结果:


 

 


 

文章评论

老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
10个调试和排错的小建议
10个调试和排错的小建议
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
Java程序员必看电影
Java程序员必看电影
为什么程序员都是夜猫子
为什么程序员都是夜猫子
每天工作4小时的程序员
每天工作4小时的程序员
总结2014中国互联网十大段子
总结2014中国互联网十大段子
一个程序员的时间管理
一个程序员的时间管理
我是如何打败拖延症的
我是如何打败拖延症的
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
代码女神横空出世
代码女神横空出世
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
漫画:程序员的工作
漫画:程序员的工作
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
旅行,写作,编程
旅行,写作,编程
那些争议最大的编程观点
那些争议最大的编程观点
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
编程语言是女人
编程语言是女人
程序员都该阅读的书
程序员都该阅读的书
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
 程序员的样子
程序员的样子
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
老程序员的下场
老程序员的下场
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员应该关注的一些事儿
程序员应该关注的一些事儿
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员必看的十大电影
程序员必看的十大电影
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员的鄙视链
程序员的鄙视链
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
如何成为一名黑客
如何成为一名黑客
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有