花样使用Handler与源码分析

接下来我将详细讲解“花样使用Handler与源码分析”的完整攻略。

概述

在Android应用程序中使用Handler,可以让UI线程和工作线程之间进行消息传递,从而实现UI更新。Handler是实现线程间通信的强大的工具,熟练使用Handler可以很好地提高Android应用程序的响应性和性能。

本文将介绍使用Handler的基本原则和使用技巧,并解析Handler的源码,帮助开发者更好地掌握Handler的使用。

Handler的基本原则

  1. Handler的创建必须在主线程中进行。

  2. 每个Handler实例关联一个Looper和MessageQueue。

  3. Handler可以将Runnable或Message对象投递到MessageQueue中。

  4. 通过Handler.post或Handler.sendMessage方法可以向MessageQueue中投递Runnable或Message对象。

  5. 当Handler处理消息时,它会与当前的线程进行关联。

  6. Handler可以用于实现定时器功能。

  7. Handler不建议用作数据存储容器。建议使用其他合适的数据存储方式。

Handler的使用技巧

以下是使用Handler的一些技巧。

把Handler放在子线程中

Handler通常与主线程关联,但也可以与其他线程关联。在UI线程中使用Handler可以更新UI,但是在子线程中使用Handler也可以执行一些耗时操作,从而避免阻塞UI线程。下面是使用Handler在子线程中执行的示例。

val handler = Handler(Looper.getMainLooper())

Thread(Runnable {
    // 一些耗时的操作
    val message = handler.obtainMessage(1, "result")
    handler.sendMessage(message)
}).start()

val handlerCallback = object : Handler.Callback {
    override fun handleMessage(msg: Message): Boolean {
        // 处理消息
        return true
    }
}

val handler = Handler(Looper.getMainLooper(), handlerCallback)

Thread(Runnable {
    // 一些耗时的操作
    val message = Message.obtain()
    message.what = 1
    message.obj = "result"
    handler.sendMessage(message)
}).start()

使用Handler实现UI更新

在Android应用程序中经常需要在子线程中进行耗时操作,并在操作完成后更新UI。为了实现UI更新,我们需要使用Handler。下面是使用Handler在子线程中更新UI的示例。

val handler = Handler(Looper.getMainLooper())

Thread(Runnable {
    // 在子线程中执行耗时操作
    val message = handler.obtainMessage()
    message.what = 1
    message.obj = "result"
    handler.sendMessage(message)
}).start()

val handlerCallback = object : Handler.Callback {
    override fun handleMessage(msg: Message): Boolean {
        when (msg.what) {
            1 -> {
                // 更新UI
                textView.text = msg.obj.toString()
            }
        }
        return true
    }
}

val handler = Handler(Looper.getMainLooper(), handlerCallback)

Thread(Runnable {
    // 在子线程中执行耗时操作
    val message = Message.obtain()
    message.what = 1
    message.obj = "result"
    handler.sendMessage(message)
}).start()

Handler源码分析

本节将对Handler的源码进行分析。

Handler的构造函数

Handler的构造函数中关联了Looper和MessageQueue。Handler通过Looper.getMainLooper()方法获取UI线程的Looper,这使得Handler与UI线程关联。而MessageQueue是由Looper创建的,每个Handler实例的Message对象都是存储在该MessageQueue中的。

class Handler(looper: Looper = Looper.myLooper() !!
): Object(), Callback {
    private var mLooper = looper
    private var mQueue: MessageQueue = looper.mQueue
}

Handler.post方法的实现

Handler.post方法用来将Runnable对象放入MessageQueue中,以便在未来某个时刻运行该Runnable。当Handler.post方法调用时,它会创建一个新的Message对象,然后将该Message对象发送到当前Handler关联的MessageQueue中。

fun post(r: Runnable): Boolean {
    return sendMessageDelayed(getPostMessage(r), 0)
}

fun sendMessageDelayed(msg: Message, delayMillis: Long): Boolean {
    if (delayMillis < 0) {
        delayMillis = 0
    }
    return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis)
}

fun sendMessageAtTime(msg: Message, uptimeMillis: Long): Boolean {
    val queue: MessageQueue = mQueue
    if (queue == null) {
        throw IllegalStateException("Handler not attached")
    }
    return enqueueMessage(queue, msg, uptimeMillis)
}

private fun enqueueMessage(queue: MessageQueue, msg: Message, uptimeMillis: Long): Boolean {
    msg.target = this
    return queue.enqueueMessage(msg, uptimeMillis)
}

Handler.sendMessage方法的实现

Handler.sendMessage方法用来将Message对象放入MessageQueue中,以便在未来某个时刻运行该对象。当Handler.sendMessage方法调用时,它会创建一个新的Message对象,然后将该Message对象发送到当前Handler关联的MessageQueue中。

fun sendMessage(msg: Message): Boolean {
    return sendMessageDelayed(msg, 0)
}

fun sendMessageDelayed(msg: Message, delayMillis: Long): Boolean {
    if (delayMillis < 0) {
        delayMillis = 0
    }
    val uptimeMillis: Long = SystemClock.uptimeMillis() + delayMillis
    return sendMessageAtTime(msg, uptimeMillis)
}

fun sendMessageAtTime(msg: Message, uptimeMillis: Long): Boolean {
    val queue: MessageQueue = mQueue
    if (queue == null) {
        throw IllegalStateException("Handler not attached")
    }
    return enqueueMessage(queue, msg, uptimeMillis)
}

private fun enqueueMessage(queue: MessageQueue, msg: Message, uptimeMillis: Long): Boolean {
    msg.target = this
    return queue.enqueueMessage(msg, uptimeMillis)
}

Handler.handleMessage方法的实现

Handler.handleMessage方法是一个抽象方法。当有消息需要处理时,Handler会调用该方法。子类需要重写该方法,以根据不同的消息类型执行不同的操作。对于不同的消息类型,Handler会执行不同的操作。是最终实现逻辑,前面的方法都是为它服务。

open fun handleMessage(msg: Message) {
}

以上就是本文的“花样使用Handler与源码分析”的完整攻略,希望对您的学习有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:花样使用Handler与源码分析 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 打造学霸的惠普智能教育本,开启K12家庭教育AI新时代

    打造学霸的惠普智能教育本,开启K12家庭教育AI新时代 惠普智能教育本是一款专为K12家庭教育市场打造的智能教育设备,它采用了人工智能技术,可以为学生提供更加个性化、高效的学习体验。下面是一份关于如何打造学霸的惠普智能教育本的完整攻略,包括背景介绍、技术特点、应用场景、示例说明等。 1. 背景介绍 随着人工智能技术的不断发展,智能教育设备已经成为了教育行业的…

    云计算 2023年5月16日
    00
  • [CC]点云密度计算

      包括两种计算方法:精确计算和近似计算(思考:local density=单位面积的点数 vs  local density =1/单个点所占的面积) Two methods can be used to compute the density: either ‘Precise’: the density is estimated by counting …

    云计算 2023年4月12日
    00
  • JavaScript深入介绍WebAPI的用法

    JavaScript深入介绍WebAPI的用法 WebAPI是什么 WebAPI是Web开发中提供给JavaScript访问浏览器功能的一组API。它包括DOM(文档对象模型)、BOM(浏览器对象模型)以及其他一些API,开发者可以利用这些API来操作页面中的元素、处理事件、发送请求、操作浏览器等。 WebAPI应用示例 清除表单 const resetBt…

    云计算 2023年5月17日
    00
  • Python学习笔记_数据排序方法

    Python学习笔记_数据排序方法 数据排序是常用的程序处理方法。Python 标准库提供了多种排序方法,包括内置函数sorted()和list.sort()方法等等。本文将介绍Python内置的数据排序方法,包括常见的几种算法及其实现,并提供一些示例说明。 内置函数sorted() Python中可以使用内置函数 sorted() 对列表进行排序。sort…

    云计算 2023年5月18日
    00
  • .net6 在中标麒麟下的安装和部署过程

    针对“.Net6在中标麒麟下的安装和部署过程”,以下是详细攻略: 安装麒麟操作系统 首先,我们需要安装麒麟操作系统。麒麟操作系统是一种开源的Linux发行版,由中国自主研发。现在已经有了7.0版本,它可以支持x86平台、arm平台,甚至是RISC-V平台。 安装.net6运行环境 安装完毕麒麟操作系统后,需要安装.net6运行环境。我们可以在dotnet官网…

    云计算 2023年5月17日
    00
  • (7)Amazon云计算核心技术之非关系型数据库服务SimpleDB和DynamoDB – 古巴少女Eis

    非关系型数据库服务主要用于存储结构化的数据,并为这些数据提供查找,删除等基本的数据库功能。 AWS中提供的非关系型数据库主要包括SimpleDB和DynamoDB。 1.非关系型数据库与传统关系数据库的比较 总结: ACID:数据库事务正确执行的四个基本要素 A — 原子性Atomicity   事务中的所有操作,要么全部完成,要么全部不完成 C — 一…

    云计算 2023年4月12日
    00
  • Python图像处理之图像与视频处理基础教程

    Python图像处理之图像与视频处理基础教程 是一份很好的学习资料,它帮助人们快速入门图像和视频处理领域。这里是一份完整的攻略,帮助你更好地了解这份教程。 准备工作 在学习 Python图像处理之图像与视频处理基础教程 前,需要做好以下准备工作: 安装Python 在学习图像和视频处理方面,我们需要使用Python 3.x版本。可以从Pyython官网下载相…

    云计算 2023年5月18日
    00
  • 云计算课程作业专业词汇

    一、虚拟化 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。 虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成…

    云计算 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部