Handler消息机制和ThreadLocal原理

一、简介

Handler作为Android线程间通信的常用方式,主要由Handler、Looper、MessageQueue、message四个部分组成 ,

  • Handler负责线程间消息通讯的发送消息和接收处理消息
  • Looper用于从MessageQueue中轮询获得Message
  • MessageQueue则是一个单线链表的用于存储Message的数据结构
  • Message则是线程间通信的载体

总体流程图如下

简单使用,如下子线程发送message,主线程更新UI

private Handler handler=new Handler(new Handler.Callback() {
   
    @Override
    public boolean handleMessage(@NonNull Message message) {
   
        //主线程更新UI
        return true;
    }
});

new Thread(new Runnable() {
   
    @Override
    public void run() {
   
        //子线程发送消息
        handler.sendEmptyMessage(1);
        //发送Runnable本质也是发送message,Runnable被赋值给Message.callback
        handler.post(runnable);
    }
}).start();

二、源码分析

2.1、Handler

先从Handler构造函数开始

public Handler(@Nullable Callback callback, boolean async) {
   
    ...
    mLooper = Looper.myLooper();
    if (mLooper == null) {
   
        throw new RuntimeException(
            "Can't create handler inside thread " + Thread.currentThread()
                    + " that has not called Looper.prepare()");
    }
    mQueue = mLooper.mQueue;
    mCallback = callback;
    mAsynchronous = async;
}

public static @Nullable Looper myLooper() {
   
    return sThreadLocal.get();
}

先是通过Looper.myLooper()获得Looper对象,Looper对象是在Looper.prepare()时创建的,但是这里我们并没有调用prepare(),是因为一开始在ActivityThreadmain方法中调用了Looper.prepareMainLooper()已经初始化了Looper

public static void main(String[] args) {
   
    ...
    Looper.prepareMainLooper();

    ActivityThread thread = new ActivityThread();
    thread.attach(false, startSeq);

    if (sMainThreadHandler == null) {
   
        sMainThreadHandler = thread.getHandler();
    }
    if (false) {
   
        Looper.myLooper().setMessageLogging(new
                LogPrinter(Log.DEBUG, "ActivityThread"));
    }
    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
    Looper.loop();

    throw new RuntimeException("Main thread loop unexpectedly exited");
}

public static void prepareMainLooper() {
   
    prepare(false);
    synchronized (Looper.class) 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值