文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

原理解析 | Android中HandlerThread原理和使用

2024-11-29 21:09

关注

原理解析

通过调用HandlerThread的构造函数并传入一个字符串作为线程名创建HandlerThread实例。

public HandlerThread(String name) {
    super(name);
    mPriority = Process.THREAD_PRIORITY_DEFAULT;
}

HandlerThread继承于Thread,本质上是一个线程,其构造方法主要是做一些初始化的操作。

我们知道了HandlerThread类其实就是一个Thread,start()方法内部调用的肯定是Thread的run方法,我们查看一下其run方法的具体实现。

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

内部调用了Looper.prepate()方法和Loop.loop()方法,熟悉Android异步消息机制知道,在Android体系中是对应着Looper对象、MessageQueue对象,以及Handler对象。

所以通过run方法,我们可以知道在我们创建的HandlerThread线程中我们创建了该线程的Looper与MessageQueue。

这里需要注意的是其在调用Looper.loop()方法之前调用了一个空的实现方法onLooperPrepared(),我们可以实现自己的onLooperPrepared方法做一些Looper的初始化操作;

run方法里面当mLooper创建完成后有个notifyAll(),getLooper()中有个wait()。因为mLooper在一个线程中执行,而我们的Handler是在UI线程初始化的,也就是说,我们必须等到mLooper创建完成,才能正确的返回getLooper()。wait()``notify()就是为了解决这两个线程的同步问题。

我们使用时需要初始化Handler实例:

Handler handler = new Handler(handlerThread.getLooper()) {
    @Override
    public void handleMessage(Message msg) {
        // 处理消息
        Log.i("HandlerThread", "接收到消息:" + msg.obj.toString());
    }
};

Handler的构造方法中传入了HandlerThread的Looper对象,所以Handler对象就拥有了HandlerThread线程中Looper对象的引用。调用Handler的sendMessage方法发送消息,在Handler的handleMessge方法中就可以接收到消息。

基本用法

  1. 创建HandlerThread实例

通过调用HandlerThread的构造函数并传入一个字符串作为线程名创建HandlerThread实例。

HandlerThread handlerThread = new HandlerThread("mHandlerThread");

"mHandlerThread"是线程的名字。

  1. 启动HandlerThread

在创建HandlerThread实例后,需要调用start()方法来启动线程。

handlerThread.start();
  1. 获取Handler

HandlerThread启动后,通过调用getLooper()方法并将其传递给Handler的构造函数来获取一个与HandlerThread关联的Handler实例,用于在HandlerThread中发送和处理消息。

Handler handler = new Handler(handlerThread.getLooper()) {
    @Override
    public void handleMessage(Message msg) {
        // 处理消息
        Log.i("HandlerThread", "接收到消息:" + msg.obj.toString());
    }
};
  1. 发送消息到HandlerThread

使用上一步中创建的Handler实例发送消息到HandlerThread。

// 使用sendMessage()方法发送消息
Message message = Message.obtain();
message.obj = "111111";
handler.sendMessage(message);

message = Message.obtain();
message.obj = "222222";
handler.sendMessage(message);

// 或者使用post()方法发送Runnable对象
handler.post(new Runnable() {
    @Override
    public void run() {
        Log.i("HandlerThread", "执行Runnable的run方法");
    }
});
  1. 处理消息

在Handler的handleMessage()方法中处理从主线程或其他线程发送过来的消息。

  1. 停止HandlerThread

通过调用Handler的quit()或quitSafely()方法来停止消息循环。HandlerThread在完成当前消息处理后终止。

handler.quit(); 
// 或者 
handler.quitSafely();
  1. 注意事项
来源:沐雨花飞蝶内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯