[转]Android的Handler总结

一、Handler的定义:
主要接受子线程发送的数据, 并用此数据配合主线程更新UI.
解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button, Android会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示"强制关闭".这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据), 把这些消息放入主线程队列中,配合主线程进行更新UI。

二、Handler一些特点
handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
它有两个作用: (1):安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行

Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post类方法允许你排列一个Runnable对象到主线程队列中,
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

三、Handler实例
(1) 子类需要继承Handler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据
以下为一个实例,它实现的功能为 : 通过线程修改界面Button的内容

1 public class MyHandlerActivity extends Activity{
2 Buttonbutton;
3 MyHandlermyHandler;
4
5 protected void onCreate(BundlesavedInstanceState){
6 super .onCreate(savedInstanceState);
7 setContentView(R.layout.handlertest);
8
9 button = (Button)findViewById(R.id.button);
10 myHandler = new MyHandler();
11 // 当创建一个新的Handler实例时,它会绑定到当前线程和消息的队列中,开始分发数据
12 // Handler有两个作用,(1):定时执行Message和Runnalbe对象
13 // (2):让一个动作,在不同的线程中执行.
14
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
24 // 以上方法以post开头的允许你处理Runnable对象
25 // sendMessage()允许你处理Message对象(Message里可以包含数据,)
26
27 MyThreadm = new MyThread();
28 new Thread(m).start();
29 }
30
31 /**
32 *接受消息,处理消息,此Handler会与当前主线程一块运行
33 * */
34
35 class MyHandler extends Handler{
36 public MyHandler(){
37 }
38
39 public MyHandler(LooperL){
40 super (L);
41 }
42
43 // 子类必须重写此方法,接受数据
44 @Override
45 public void handleMessage(Messagemsg){
46 // TODOAuto-generatedmethodstub
47 Log.d( " MyHandler " , " handleMessage...... " );
48 super .handleMessage(msg);
49 // 此处可以更新UI
50 Bundleb = msg.getData();
51 Stringcolor = b.getString( " color " );
52 MyHandlerActivity. this .button.append(color);
53
54 }
55 }
56
57 class MyThread implements Runnable{
58 public void run(){
59
60 try {
61 Thread.sleep( 10000 );
62 } catch (InterruptedExceptione){
63 // TODOAuto-generatedcatchblock
64 e.printStackTrace();
65 }
66
67 Log.d( " thread....... " , " mThread........ " );
68 Messagemsg = new Message();
69 Bundleb = new Bundle(); // 存放数据
70 b.putString( " color " , " 我的 " );
71 msg.setData(b);
72
73 MyHandlerActivity. this .myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
74
75 }
76 }
77 78}

更多相关文章

  1. android 字符串数组资源
  2. android Application学习之二
  3. Android(安卓)ListView Adapter的getItemViewType和getViewTypeC
  4. Android(安卓)ListView Adapter的getItemViewType和getViewTypeC
  5. android Activity类的runOnUiThread
  6. Android设备和PC设备有线USB连接双向通信预研报告
  7. Android的数据存储方式
  8. android如何查看app数据(无root权限)
  9. mybatisplus的坑 insert标签insert into select无参数问题的解决

随机推荐

  1. android handler消息机制
  2. android中使用别人的UI框架
  3. android java开发 第一天 之熟悉eclipse
  4. 获取手机通讯录
  5. 修复 XE8 for Android 方向传感器 headin
  6. android发生主机无法解析错误的问题(
  7. Android 内存数据库
  8. Android(安卓)中sp、dp、px转换,以及获取
  9. 2011.06.21(2)——— android invalidate
  10. android 长按power键弹出对话框