Android中关于Handle的用法和分析

Handler

1.作用:

(1). 结合Thread实现连网读取数据,读取数据后更新页面,即从子线程给主线程提供一个消息报告的作用

因此主线程中一旦接收到此消息报告,即可更新页面。

(2). 指定一系列的动作排队执行

2.实现步骤:

1. 创建Handler对象

注:在new对象的结尾添加{},并重写handleMessage方法

2. 通过handler发送消息

      2.1在发送消息时可选择发送空消息或者非空消息

            非空消息与空消息的区别:

                   空消息中只能携带一个int类型的数字

                  非空消息中除了可以携带int类型的数字外,还可携带一些其他数据

            发送消息时可选择的方法:

                     a) sendEmptyMessageint 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对象的arg1arg2属性携带数据,添加数据的方式与obj属性相同msg.属性名 =  赋值;

           此两条属性只能携带int类型的数据

(3) 通过msg对象的setData(Bundle args)方法携带数据

对应的取出数据的方式:

handleMessage方法中,通过参数msg对象

(1) Object o = msg.obj;  取出msg对象的obj属性的值

注:接收该属性的对象可以按需求写成任意类型

如,接收的是一个Bitmap图片数据

则可:Bitmap o= Bitmapmsg.obj;

(2) 通过msg.arg1进行取值即可

(3) 通过msg.getData 先取出传递过来的Bundle对象,然后通过Bundle对象调用get方法根据key取出对应的value

应该在什么情况下选择哪种方式携带数据?

1. 如果要携带的数据的类型和个数不超出2int1个任意类型时,推荐直接使用对应的属性进行携带

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对象的发送消息方法并不会阻塞主线程的运行,即如果在发送消息的代码后方有其他代码,那么不会等到消息处理完后再后续代码,而是直接运行后续代码

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值