玩转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):使用提供的这个队列替换默认的那一个并且通过处理消息而的得到一个回调接口
?
?
公共方法:
?
?
?
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(); } } };}?

?
?