Handler是Android消息模型最重要的一个组件,使用它可以在线程之间相互发送消息,实现线程之间的通信。处理使用Handler发送消息以外,通常需要继承Handler类,并重写handleMessage(Message msg) 方法, 接收消息并处理消息。
下面通过一个实例来说明Handler的使用方法。例子的主要功能是:通过线程修改界面Button的内容,完整的代码如下:
注意:用Handler的obtainMessage方法获得的Message可以省去创建Message的空间开销
01 |
public class MyHandlerActivity extends Activity
{ |
02 |
03 |
Button
button; |
04 |
MyHandler
myHandler; |
05 |
06 |
protected void onCreate(Bundle
savedInstanceState) { |
07 |
super .onCreate(savedInstanceState); |
08 |
setContentView(R.layout.handlertest); |
09 |
button
= (Button) findViewById(R.id.button); |
10 |
myHandler
= new MyHandler(); |
11 |
//
当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据 |
12 |
//
Handler有两个作用, |
13 |
//(1)
: 定时执行Message和Runnalbe 对象 |
14 |
//
(2): 让一个动作,在不同的线程中执行. |
15 |
//
它安排消息,用以下方法 |
16 |
//
post(Runnable) |
17 |
//
postAtTime(Runnable,long) |
18 |
//
postDelayed(Runnable,long) |
19 |
//
sendEmptyMessage(int) |
20 |
//
sendMessage(Message); |
21 |
//
sendMessageAtTime(Message,long) |
22 |
//
sendMessageDelayed(Message,long) |
23 |
//
以上方法以 post开头的可以处理Runnable对象 |
24 |
//sendMessage()可以处理Message对象(Message里可以包含数据,) |
25 |
MyThread
m = new MyThread(); |
26 |
new Thread(m).start(); |
27 |
} |
28 |
29 |
/** |
30 |
*
接受消息,处理消息 ,此Handler会与当前主线程一块运行 |
31 |
*
*/ |
32 |
class MyHandler extends Handler
{ |
33 |
|
34 |
//默认构造函数 |
35 |
public MyHandler()
{ |
36 |
super (); |
37 |
} |
38 |
|
39 |
//
带有Looper参数的构造函数 |
40 |
public MyHandler(Looper
L) { |
41 |
super (L); |
42 |
} |
43 |
//
子类必须重写此方法,处理消息 |
44 |
@Override |
45 |
public void handleMessage(Message
msg) { |
46 |
Log.d( "MyHandler" , "handleMessage......" ); |
47 |
super .handleMessage(msg); |
48 |
//
此处可以更新UI |
49 |
Bundle
b = msg.getData(); |
50 |
String
color = b.getString( "color" ); |
51 |
String
btn = msg.obj.toString(); |
52 |
MyHandlerActivity. this .button.append(color
+ btn); |
53 |
} |
54 |
} |
55 |
56 |
class MyThread implements Runnable
{ |
57 |
public void run()
{ |
58 |
try { |
59 |
Thread.sleep( 2000 ); |
60 |
} catch (InterruptedException
e) { |
61 |
//
TODO Auto-generated catch block |
62 |
e.printStackTrace(); |
63 |
} |
64 |
Log.d( "thread......." , "mThread........" ); |
65 |
//
使用Message能够传递多种数据具体可以参考Message的源码 |
66 |
//
最常用的可以使用Message的obj对象在线程之间传递对象数据 |
67 |
Message
msg = new Message(); |
68 |
Bundle
b = new Bundle(); //
存放数据 |
69 |
b.putString( "color" , "Red" ); |
70 |
msg.setData(b); |
71 |
msg.obj
= new String(“Button”); |
72 |
MyHandlerActivity. this .myHandler.sendMessage(msg); //
向Handler发送消息,更新UI |
73 |
} |
74 |
} |
75 |
} |