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)
public final boolean hasMessages (int what)
检查在消息发送期间是否在消息队列中有'what'
public final Message obtainMessage (int what, int arg1, int arg2)
就像objectMessage()一样,除了它还要设置what,arg1,arg2等几个返回的参数
参数
what | 返回值传递给Message.what |
---|---|
arg1 | 返回值传递给Message.arg1 |
arg2 | 返回值传递给Message.arg2 |
Returns
- 一个来自全局消息池的消息
public final Message obtainMessage ()
public final Message obtainMessage (int what, int arg1, int arg2, Object obj)
参数
what | 返回值传递给 Message.what |
---|---|
arg1 | 返回值传递给 Message.arg1 |
arg2 | 返回值传递给 Message.arg2 |
obj | 返回值传递给 Message.obj |
Returns
- 一个从公共消息池中得到的消息
public final Message obtainMessage (int what)
public final Message obtainMessage (int what, Object obj)
public final boolean post (Runnable r)
Parameters
r | 可以被执行的Runnable对象 |
---|
Returns
- 如果Runnable对象成功插入到消息队列中就返回true. 如果失败返回false,一般是因为退出了循环处理消息队列
public final boolean postAtFrontOfQueue (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)
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)
public final void removeMessages (int what, Object object)
public final boolean sendEmptyMessage (int what)
Returns
- 如果消息成功的被放置到了消息队列,返回true,如果失败返回false,通常是由于退出了循环处理消息队列
public final boolean sendEmptyMessageAtTime (int what, long uptimeMillis)
public final boolean sendEmptyMessageDelayed (int what, long delayMillis)
public final boolean sendMessage (Message msg)
public final boolean sendMessageAtFrontOfQueue (Message msg)
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();
}
}
};
}