关于Handler

做Android开发肯定离不开Handler,我们都知道,它主要是做主线程与子线程之间的通信工具,所以只要有异步线程与主线程的地方就有Handler

1.对Handler的基本认识

Handler 发送并处理与一个线程关联的 Message 和 Runnable ,每个 Handler 都会跟一个线程绑定,并与该线程的 MessageQueue 关联在一起,从而实现消息的管理以及线程间通信。

1.1基本用法

android.os.Handler handler = new Handler(){
  @Override
  public void handleMessage(final Message msg) {
    //这里接受并处理消息
  }
};
//发送消息
handler.sendMessage(message);
handler.post(runnable);

实例化一个 Handler 重写 handleMessage 方法 ,然后在需要的时候调用它的 send 以及 post 系列方法就可以了

2.Handler的原理

2.1  Handler和Looper的关联

实例化 Handler 的时候 Handler 会去检查当前线程的 Looper 是否存在,如果不存在则会报异常,也就是说在创建 Handler 之前一定需要先创建 Looper 。

public Handler(Callback callback, boolean async) { Looper mLooper = Looper.myLooper(); if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.prepare()"); } //Looper 持有一个 MessageQueue mQueue = mLooper.mQueue; }

平时直接使用感受不到这个异常是因为主线程已经为我们创建好了 Looper,Looper 提供了 Looper.prepare()  方法来创建 Looper ,并且会借助 ThreadLocal 来实现与当前线程的绑定功能。

2.2 Message 的存储与管理

sendEmptyMessage(int)  方法为例:

//Handler
sendEmptyMessage(int)
  sendEmptyMessageDelayed(int,int)
     sendMessageAtTime(Message,long)
      enqueueMessage(MessageQueue,Message,long)
  			queue.enqueueMessage(Message, long);

2.3 总结

  • Looper :负责关联线程以及消息的分发在该线程下**从 MessageQueue 获取 Message,分发给 Handler ;
  • MessageQueue :是个队列,负责消息的存储与管理,负责管理由 Handler 发送过来的 Message ;
  • Handler : 负责发送并处理消息,面向开发者,提供 API,并隐藏背后实现的细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值