Android多线程编程之HandlerThread学习篇(四)

Android多线程编程之HandlerThread学习篇(四)

一、介绍

之前学习了Handler、IntentService以及线程池等内容后,再来看HandlerThread,就显得相对比较简单了,HandlerThread其实就是一个线程,只不过是它可以直接使用Handler的线程。HandlerThread在内部创建了消息队列。

下面简要举例说明一下如何使用HandlerThread:

mHandlerThread = new HandlerThread("jkYishon-HandlerThread");
mHandlerThread.start();

mHandler = new Handler(mHandlerThread.getLooper()) {
    @Override
    public void handleMessage(Message msg) {
        //模拟耗时任务
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.v("mHandler", "handleMessage");
    }
};
mHandler.sendEmptyMessage(0);

二、工作原理

HandlerThread在初始化的时候只是初始化了线程的名称以及线程的优先级。而在启动这个线程时,最主要是看run方法中的所做的事情。

public void run() {
    mTid = Process.myTid();
    Looper.prepare();
    synchronized (this) {
        mLooper = Looper.myLooper();
        notifyAll();
    }
    Process.setThreadPriority(mPriority);
    onLooperPrepared();
    Looper.loop();
    mTid = -1;
}

在run方法中初始化了Looper对象,并且也初始化了消息队列等。onLooperPrepared主要是在执行消息循环之前所需要做的一些事情。而在初始化Handler的时候会用HandlerThread的getLooper方法获取。

public Looper getLooper() {
    if (!isAlive()) {
        return null;
    }

    // If the thread has been started, wait until the looper has been created.
    synchronized (this) {
        while (isAlive() && mLooper == null) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
    }
    return mLooper;
}

其中run方法中的同步代码块中的notifyAll和getLooper方法中同步代码块中的wait方法是为了m初始化Handler的时候传入的参数Looper保证mHandlerThread在run方法中以及初始化了Looper对象。因为一个是在HandlerThread线程中初始化,而获取Looper对象是在UI主线程中获取,就必须保持线程同步,因而在此采用了这样的方式。

当Handler发送消息的时候,会将消息传给消息队列,而在HandlerThread中的run方法中调用的Looper.loop()可以无限从消息队列中取消息,那么之后Handler处理消息。在handleMessage中执行的代码其实是在HandlerThread线程中执行的。

另外需要注意的是,因为HandlerThread中的run方法中会不断无限循环取消息,那么在没有消息的时候会阻塞线程的执行。所以在没有任务需要处理的时候,则需要调用quit()或quitSafty()方法退出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jkYishon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值