Android handler src track

134 篇文章 0 订阅
36 篇文章 0 订阅

HandlerThread 是 真正干活的,本身就是一个Thread:

HandlerThread extends Thread

主要比普通的Thread多了一个Looper,而hanlderThread的run函数其实很简单:

    @Override
    public void run() {
        mTid = Process.myTid();
        Looper.prepare();               这一步就生了该Thread自己的Looper
        synchronized (this) {
            mLooper = Looper.myLooper(); mLooper其实一个ThreadLocal变量,每个Thread有自己的一个Looper
            notifyAll();
        }
        Process.setThreadPriority(mPriority);
        onLooperPrepared();
        Looper.loop();        在得到Looper以后,就开始无限loop了,直到被要求结束,才会结束run函数,而HandlerThread的生命也结束。
        mTid = -1;
    }

Looper中有一个static final 的 ThreadLocal:

static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();   这就意味着每个Thread 都有一个自己的sThreadLocal

而sThreadLocal中的Looper是在prepare()时生成的:

    private static void prepare(boolean quitAllowed) {
        if (sThreadLocal.get() != null) {
            throw new RuntimeException("Only one Looper may be created per thread");
        }
        sThreadLocal.set(new Looper(quitAllowed));
    }
Looper中有

    final MessageQueue mQueue;    就是存放要执行的任务, 在构造时生成: mQueue = new MessageQueue(quitAllowed);
    final Thread mThread;                 记录运行自己的Thread, 在构造的时候就绑定了: mThread = Thread.currentThread();

Looper的quit其实就是mQueue的quit:

    public void quit() {
        mQueue.quit(false);
    }

可以看到,真正干活的所有成员就是handlerThread,

而Handler的作用在这里类似于一个对Looper的代理和封装:

首先,handler的构造需要一个Looper, 如果不制定Looper,那么就用当前线程的Looper,因此,在一个Thread使用Handler的前提是该线程的Looper要存在。

public Handler(Callback callback, boolean async) {
........................................................

        mLooper = Looper.myLooper();
        if (mLooper == null) { 如果当前Thread还没有自己的Looper,那么就 RuntimeException。
            throw new RuntimeException(
                "Can't create handler inside thread that has not called Looper.prepare()");
        }
        mQueue = mLooper.mQueue;
        mCallback = callback;
        mAsynchronous = async;
    }

而handler基本做的所有关键工作,就是对Looper操作的再封装罢了:

比如,post:

post(Runnable r) -> sendMessageDelayed(getPostMessage(r), 0); -> sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis)

-> enqueueMessage(queue, msg, uptimeMillis) -> queue.enqueueMessage(msg, uptimeMillis)

这里的queue,就是Looper的MessageQueue。


Looper提供了 loop()<处理任务的方法> 和 MessageQueue<存放待运行任务的队列> , handlerThread 则负责实际的执行<苦力>

而handler则是对上面这个机制的简便性包装.

handler的封装性也体现在对于其enqueueMessage(...)中,这一步会把要enqueue的Message的target设置为handler自己,这样在后面的Looper的loop()中处理Message时,会直接调用msg.target.dispatchMessage(msg), 这样就实现了handler enqueue的Message最后由handler自己来处理.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值