Android中关于Handle的用法和分析
Handler
1.作用:
(1). 结合Thread实现连网读取数据,读取数据后更新页面,即从子线程给主线程提供一个消息报告的作用
因此主线程中一旦接收到此消息报告,即可更新页面。
(2). 指定一系列的动作排队执行
2.实现步骤:
1. 创建Handler对象
注:在new对象的结尾添加{},并重写handleMessage方法
2. 通过handler发送消息
2.1在发送消息时可选择发送空消息或者非空消息
非空消息与空消息的区别:
空消息中只能携带一个int类型的数字
非空消息中除了可以携带int类型的数字外,还可携带一些其他数据
发送消息时可选择的方法:
a) sendEmptyMessage(int what)发送空消息
参数作用:给当前发送的消息匹配一个唯一标识 由于所有通过handler对象发送的消息,最后都会到同一个 handleMessage方法中进行接收
因此,为了handleMessage方法中区分当前接收的消息是哪一个条通过msg对象的what属性进行判断
b) sendMessage (Message msg) 发送非空消息
2.2发送步骤:
1)封装要发送的Message对象
初始化方式有以下3种:
Message msg = new Message();
Message msg = Message.obtain();
Message msg = handler.obtainMessage();
推荐选择后两种方式的任意一种进行初始化,不推荐使用new Message方法获取对象
原因:后两种方式在创建对象时会去判断内存中是否有能够直接使用的Message对象,如果有,直接拿来用,
如果没有,再新建对象使用。通过后两种方式可以减少创建对象的个数,在内存方面比较优化
2) 通过调用msg.what = n(任意数字)给当前封装的msg对象的what属性赋值
3) 向Message对象中添加要携带的数据
可选的添加数据的方式:
(1) msg.obj = Object(任意类型的对象) 给msg对象的obj属性赋值
(2) 通过msg对象的arg1和arg2属性携带数据,添加数据的方式与obj属性相同msg.属性名 = 赋值;
此两条属性只能携带int类型的数据
(3) 通过msg对象的setData(Bundle args)方法携带数据
对应的取出数据的方式:
在handleMessage方法中,通过参数msg对象
(1) Object o = msg.obj; 取出msg对象的obj属性的值
注:接收该属性的对象可以按需求写成任意类型
如,接收的是一个Bitmap图片数据
则可:Bitmap o= (Bitmap)msg.obj;
(2) 通过msg.arg1进行取值即可
(3) 通过msg.getData 先取出传递过来的Bundle对象,然后通过Bundle对象调用get方法根据key取出对应的value
应该在什么情况下选择哪种方式携带数据?
1. 如果要携带的数据的类型和个数不超出2个int和1个任意类型时,推荐直接使用对应的属性进行携带
2. 如果要携带的数据的类型或者个数超出上述的限制,那么使用setData方法进行携带
3. 在handleMessage中接收通过sendEmptyMessage或者通过sendMessage方法发送过来的消息
4. 通过handleMessage方法中的参数msg对象获取msg.what属性的值即可区分当前接收的是哪一个发送过来的消息
使用Handler时的注意事项:
1. handleMessage名称不要写错,参数列数不要修改
2. 在初始化Handler对象,重写handleMessage方法的时候,注意不要写成以下格式:
3. 在一个Activity中支持创建多个Handler对象,当发送消息后,由哪个handleMessage方法进行消息的处理,取决于发送消息的对象是哪个------哪个handler对象发送的消息,就有哪个handler对象进行消息的处理
4. handler对象的发送消息方法并不会阻塞主线程的运行,即如果在发送消息的代码后方有其他代码,那么不会等到消息处理完后再后续代码,而是直接运行后续代码