Android初学笔记之<Handler理解>
2015-05-15 16:08
267 查看
使用线程的原因:当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。
UI线程不安全,不能直接在其他线程中直接更新UI界面,否则会报错。因此需要使用Handler实现主线程和其他线程之间的通信,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受并处理子线程传过来的(子线程用sedMessage()方法传递)Message对象(里面包含数据),配合主线程进行更新UI。
如图所示是本人的理解,不当之处还望指正。
流程如下:
子线程发送一个msg到主线程管理的MessageQueue中,主线程的Looper一直抽取Message,当抽取到该msg后,调用相应的Handler对象的handleMessage方法对其进行处理。一般Handler对象都在主线程中创建,是子线程与主线程沟通的桥梁,子线程调用handler对象的sendMessage方法发送msg到消息队列中,主线程中handler对象则调用handleMessage方法对msg进行处理。
重写子线程run方法的步骤:
判断线程是否被终止,如果未被终止则执行以下步骤
①从消息池中获取Message对象(不要new Message()).
Message msg = handler.obtainMessage();
②给该msg设置标识 msg.what = 0x101; 属性what类型为int
③将要与主线程通信的数据绑定到Message中,如果只需要携带简单的int类型信息,则只需要使用arg1和arg2属性来传递信息。如果要携带其他String等比较大的信息,则可以使用Bundle对象,然后把bundle对象绑定到Message中(msg.setData(bundle)
④调用handler.sendMessage(msg)发送msg到MessageQueue中
重写handleMessage方法:根据不同msg.what属性分辨不同消息进行处理(可以使用switch语句),获取msg携带的数据并根据数据来更新UI。
UI线程不安全,不能直接在其他线程中直接更新UI界面,否则会报错。因此需要使用Handler实现主线程和其他线程之间的通信,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受并处理子线程传过来的(子线程用sedMessage()方法传递)Message对象(里面包含数据),配合主线程进行更新UI。
如图所示是本人的理解,不当之处还望指正。
流程如下:
子线程发送一个msg到主线程管理的MessageQueue中,主线程的Looper一直抽取Message,当抽取到该msg后,调用相应的Handler对象的handleMessage方法对其进行处理。一般Handler对象都在主线程中创建,是子线程与主线程沟通的桥梁,子线程调用handler对象的sendMessage方法发送msg到消息队列中,主线程中handler对象则调用handleMessage方法对msg进行处理。
重写子线程run方法的步骤:
判断线程是否被终止,如果未被终止则执行以下步骤
①从消息池中获取Message对象(不要new Message()).
Message msg = handler.obtainMessage();
②给该msg设置标识 msg.what = 0x101; 属性what类型为int
③将要与主线程通信的数据绑定到Message中,如果只需要携带简单的int类型信息,则只需要使用arg1和arg2属性来传递信息。如果要携带其他String等比较大的信息,则可以使用Bundle对象,然后把bundle对象绑定到Message中(msg.setData(bundle)
④调用handler.sendMessage(msg)发送msg到MessageQueue中
重写handleMessage方法:根据不同msg.what属性分辨不同消息进行处理(可以使用switch语句),获取msg携带的数据并根据数据来更新UI。
相关文章推荐
- Android初学笔记之<handler.obtainMessage()方法理解>
- android初学笔记之<findViewById方法返回Null的原因>
- Android初学笔记之<adb服务报错>
- Android初学笔记之<Progress进度条>
- Android初学笔记之<使用真机进行测试Android工程>
- Android初学笔记之<LogCat只输出某一特定应用或某一特定TAG>
- Js初学笔记之<创建对象的五种方式>
- JavaSE笔记之<继承深入理解>
- JavaSE笔记之<多态深入理解>
- JavaSE笔记之<泛型再理解(简化版)>
- JavaSE初学笔记之<多线程>
- JavaSE初学笔记之<并发编程—内存模型、可见性、原子性>
- JavaSE初学笔记之<nio的学习>
- JavaSE初学笔记之<nio的write事件的深入>
- <android 笔记>通知栏学习
- <android 笔记>通知栏学习2
- <<深入理解虚拟机>>笔记------垃圾收集器
- Android笔记—通过SharedPreferences将List<Map<String, String>>进行存储
- java_web初学笔记之<java的反射机制>
- java_web初学笔记之<JavaBean及内省机制>