android handler的用法与处理机制

android handler的用法与处理机制

应用场景

我们在实际开发中,总会遇到处理网络信息、子线程中需要进行更新UI操作、封装一些请求回调等api,这时便需要处理不同线程之间的通信,而我们android提供的handler消息处理机制便发挥到了作用。

相关概念

Message 消息:

理解为线程间通讯的数据单元。例如后台线程在处理数据完毕后需要更新UI,则可发送一条包含更新信息的Message给UI线程。
Message Queue 消息队列:

用来存放通过Handler发布的消息,按照先进先出执行。
Handler :

Handler是Message的主要处理者,负责将Message添加到消息队列以及对消息队列中的Message进行处理。
Looper 循环器:

扮演Message Queue和Handler之间桥梁的角色,循环取出Message Queue里面的Message,并交付给相应的Handler进行处理。
线程 :

UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。每一个线程里可含有一个Looper对象以及一个MessageQueue数据结构。在你的应用程序里,可以定义Handler的子类别来接收Looper所送出的消息。


Handler的使用

handler原理

最根本的目的就是解决多线程并发的问题,假设在一个 Activity 当中,有多个线程去更新 UI,并且对更新的 UI 的操作进行枷锁处理的话又会产生什么样的问题呢? 那就是性能下降,Handler 通过消息队列,保证了消息处理的先后有序。

鉴于以上问题的考虑,Android 给我们提供了一套更新 UI 的机制,我们只要使用一套机制就好,所有的更新 UI 的操作都是在主线程中轮询处理。

Handler 封装了消息的发送(主要包括消息发送给谁) 

Looper:内部包含一个消息队列也就是 MessageQueue,所有 Handler 发送的消息都走向这个队列。

Looper.loop()方法,就是一个 for 死循环,不断的从 MessageQueue 取消息,如果有消息就处理消息,没有消息就阻塞。

MessageQueue,就是一个消息队列,可以添加消息,处理消息。

Handler 也不难,比较简单,在构造 Handler 时候内部会跟 Looper 进行关联,通过 Looper.myLooper() 获取到 Looper,找到 Looper 也就找到了 MessageQueue。在 Handler 中发送消息,其实是向 MessageQueue 队列中发送消息。

代码演示

 //创建一个Handler,我们在哪个线程中实例化的
        // 这个handler是与哪个线程进行绑定的,一般是在主线程中实例化
         Handler  handler=new Handler();
handler有两种消息分发方式一种是发送Runnable对象,另一种是发送message消息的方式。

发送Runnable对象的fangsh

   //创建一个Runnable对象
        Runnable myRunnable=new Runnable() {
            @Override
            public void run() {
            //需要在主线程中执行的任务...
            }
        };
        //通过发送Runnable对象的方式将子线程任务发回到主线程去执行
        //post立即执行Runnable对象
        //postAtTime在指定时间执行
        //postDelayed在指定时间间隔执行
        handler.post(myRunnable);
发送message消息的方式
    //向主线程中发送消,通过obtainMessage()来获取可以复用
        //消息队列中的msg这样可以减少资源浪费
        Message msg=handler.obtainMessage();
        msg.arg1=1;
        msg.obj="发送各种消息";
        //向主线程中发送消息
        handler.sendMessage(msg);
        
通过重写handleMessage方法来获取信息内容

    private Handler handler=new Handler(){
        public void handleMessage(android.os.Message msg){
            //通过重写handleMessage方法来,接受消息
            int what=msg.what;
            int arg=msg.arg1;
          String obj= (String) msg.obj;
            //针对得到的消息进行相应的业务处理....
        }
    };





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值