Android:HandlerThread学习

栏目: Android · 发布时间: 6年前

内容简介:在Android中,主线程与子线程的交互,例如在子线程进行网络请求,请求后将数据更新到View上,我们常用Handler或者AsyncTask。HandlerThread与它们的区别在于会创建工作线程、Hanlder和Looper。这样就不用在主线程创建Handler或者AsyncTask的硬性要求。可以说HandlerThread是Handler的应用场景。HandlerThread继承至Thread,所以本身也是一个线程。先撸代码为敬,下面是一般例子代码。在HandlerThread构造方法中可以随意传

在Android中,主线程与子线程的交互,例如在子线程进行网络请求,请求后将数据更新到View上,我们常用Handler或者AsyncTask。HandlerThread与它们的区别在于会创建工作线程、Hanlder和Looper。这样就不用在主线程创建Handler或者AsyncTask的硬性要求。可以说HandlerThread是Handler的应用场景。

HandlerThread的使用

HandlerThread继承至Thread,所以本身也是一个线程。先撸代码为敬,下面是一般例子代码。

HandlerThread handlerThread = new HandlerThread("handler");

        handlerThread.start();

        Handler workerHandler = new Handler(handlerThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //doSomething
            }
        };

        workerHandler.post(new Runnable() {
            @Override
            public void run() {
                //doSomething
            }
        });

复制代码

在HandlerThread构造方法中可以随意传入一个字符串,该字符串只用于区别而已,这里是 handler 。接着将HandlerThread对象的Looper对象作为Handler的参数,新建Handler对象。这样就将工作线程的Looper和Handler绑定在一起了,也就是工作线程和Handler绑定在一起了。通过Handler对象发送消息或者任务到Looper对象中的消息队列,在工作线程中处理消息或任务。

如果不再使用工作线程,建议调用HandlerThread对象的 quitSafely 方法退出,避免不要的资源浪费。

源码分析

在理解了Android的消息机制之后,ThreadHandler的原理可以说非常的简单,只是Android消息机制的一个应用。

HandlerThread 的构造器

public HandlerThread(String name) {
        super(name);
        mPriority = Process.THREAD_PRIORITY_DEFAULT;
    }
    
    public HandlerThread(String name, int priority) {
        super(name);
        mPriority = priority;
    }
复制代码

HandlerThread有两个重载构造器,一个是使用线程默认优先级的构造器,一个是可以供用户自己定义线程优先权的构造器。

HandlerThread的Run方法

在线程中,调用Thread对象的start方法,最终会run方法。而HandlerThread重写了run方法。

@Override
    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方法是受保护的空方法,可以通过继承HandlerThread重写该方法,在开启消息循环做一些准备。

如果对于Looper和Handler比较陌生,可以查看Android的消息机制


以上所述就是小编给大家介绍的《Android:HandlerThread学习》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网络多人游戏架构与编程

网络多人游戏架构与编程

格雷泽 (Joshua Glazer)、马达夫 (Sanjay Madhav) / 王晓慧、张国鑫 / 人民邮电出版社 / 2017-10-1 / CNY 109.00

本书是一本深入探讨关于网络多人游戏编程的图书。 全书分为13章,从网络游戏的基本概念、互联网、伯克利套接字、对象序列化、对象复制、网络拓扑和游戏案例、延迟、抖动和可靠性、改进的延迟处理、可扩展性、安全性、真实世界的引擎、玩家服务、云托管专用服务器等方面深入介绍了网络多人游戏开发的知识,既全面又详尽地剖析了众多核心概念。 本书的多数示例基于C++编写,适合对C++有一定了解的读者阅读。本......一起来看看 《网络多人游戏架构与编程》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具