您的位置:首页 > 移动开发 > Android开发

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: