当前位置: 首页 > news >正文

南通网站关键词优化郑州网络营销顾问

南通网站关键词优化,郑州网络营销顾问,在哪能学到网站建设专业,网站开发合同官司详解 Handler 机制 1、Handler 的引出场景2、主要组件2.1、Handler2.2、Message2.3、MessageQueue2.4、Looper2.5、组件之间的关系 3、工作原理及代码示例3.1、工作机制3.2、代码示例3.2.1、使用 Handler.sendMessage() 发送消息3.2.2、使用 Handler.post() 发送消息 1、Handle…

详解 Handler 机制

  • 1、Handler 的引出场景
  • 2、主要组件
    • 2.1、Handler
    • 2.2、Message
    • 2.3、MessageQueue
    • 2.4、Looper
    • 2.5、组件之间的关系
  • 3、工作原理及代码示例
    • 3.1、工作机制
    • 3.2、代码示例
      • 3.2.1、使用 Handler.sendMessage() 发送消息
      • 3.2.2、使用 Handler.post() 发送消息

1、Handler 的引出场景

有这样一个场景,需要在一个页面上倒计时5秒,然后跳转到另一个页面。如下图所示:

我们容易想到可以在子线程里倒计时五秒,倒计时结束后去跳转即可。

代码如下:
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/textView"android:gravity="center"android:layout_width="match_parent"android:layout_height="match_parent"android:textSize="30sp" /></LinearLayout>

MainActivity.kt

package com.example.handlertestimport android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.handlertest.databinding.ActivityMainBindingclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)//开启子线程Thread {for (i in 5 downTo 1) {binding.textView.text = i.toString()try {Thread.sleep(1000)} catch (e: InterruptedException) {e.printStackTrace()}}// 计时结束后跳转到新页面val intent = Intent(this, MainActivity2::class.java)startActivity(intent)}.start()}
}

但是运行的时候你会发现,这段代码大概率会报错(之所以不百分百报错是因为早期版本的Android中,或是特定情况下,可能会容忍这种行为而不立即抛出异常)。但是直接在非UI线程中更新UI组件的行为违反了Android的多线程规则。根据 Android 文档,所有的 View 操作都应该在主线程( UI 线程)中执行。这是因为 Android 的 View 系统不是线程安全的,如果尝试在非 UI 线程中直接更新 UI,理论上会触发一个 CalledFromWrongThreadException 异常,从而导致应用程序的崩溃或异常行为。

这种在子线程中处理某些操作并需要在主线程中同步更新 UI 界面的,Android 为我们提供了一套异步消息处理机制:Handler。

2、主要组件

Handler 机制的实现主要依靠以下四个组件:

2.1、Handler

Handler 是用于发送和处理消息的工具。它提供了将任务从一个线程传递到另一个线程的机制,通常用于将任务从子线程传递到主线程。

  • 发送消息:Handler 可以通过 sendMessage、post 等方法将消息或任务发送到目标线程的消息队列中。
  • 处理消息:Handler 通过重写 handleMessage 方法来处理接收到的消息。

2.2、Message

Message 是用于在不同线程之间传递数据的载体。它包含了消息的标识符、数据和目标 Handler。

字段

  • what:消息的标识符,用于区分不同类型的消息。
  • arg1 和 arg2:整型数据,可以用于传递简单的数据。
  • obj:对象数据,可以用于传递复杂的数据。
  • target:目标 Handler,用于处理消息。

2.3、MessageQueue

MessageQueue 是一个 FIFO(先进先出)的消息队列,用于存储从 Handler 发送的消息。每个线程都有一个唯一的 MessageQueue。

  • 入队:消息通过 Handler 被添加到 MessageQueue 中。
  • 出队:Looper 从 MessageQueue 中取出消息并将其分发给目标 Handler 进行处理。

2.4、Looper

Looper 是一个用于循环处理消息队列中消息的工具。每个线程只有一个 Looper,主线程默认已经有一个 Looper,可以直接拿来使用。其它线程需要自行创建后才可使用。

  • 准备:
    • 主线程:默认已经有了,也可以通过 Looper.prepareMainLooper() 方法手动创建(不推荐);
    • 子线程:通过 Looper.prepare() 方法为当前子线程创建一个 Looper。
  • 循环:通过 Looper.loop() 方法开始循环处理消息队列(MessageQueue)中的消息。
  • 获取:
    • Looper.getMainLooper():获取主线程的 Looper;
    • ContextWrapper 对象的 getMainLooper():获取主线程的 Looper;
    • Looper.myLooper():获取当前线程的 Looper。

2.5、组件之间的关系

  • 一个线程只有一个 MessageQueue 和 一个 Looper
  • 一个线程可以绑定多个 Handler
  • 一个 Handler 只能绑定一个 Looper
  • 一个 Looper 可以绑定多个 Handler

3、工作原理及代码示例

3.1、工作机制

  1. 创建 Handler:在目标线程中创建一个 Handler 实例。
  2. 发送消息:通过 Handler 的 sendMessage 或 post 方法将消息或任务发送到目标线程的 MessageQueue 中。
  3. 消息入队:消息被添加到目标线程的 MessageQueue 中。
  4. Looper 处理消息:目标线程的 Looper 不断从 MessageQueue 中取出消息,并将其分发给对应的 Handler。
  5. Handler 处理消息:Handler 的 handleMessage 方法被调用,处理接收到的消息。

通过这种机制,Android 实现了线程间的通信和任务调度,确保 UI 操作在主线程中执行,从而避免线程安全问题。

3.2、代码示例

activity_main.xml 中的代码不变,只有一个简单的 TextView 组件。下面将展示在 MainActivity.kt 中分别使用 Handler.sendMessage() 方法和 Handler.post() 方法实现本文开头所提的场景。

3.2.1、使用 Handler.sendMessage() 发送消息

package com.example.handlertestimport android.content.Intent
import android.os.Bundle
import android.os.Message
import androidx.appcompat.app.AppCompatActivity
import com.example.handlertest.databinding.ActivityMainBinding
import android.os.Handlerclass MainActivity : AppCompatActivity() {private lateinit var handler: Handleroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)// 在主线程中创建 handler,并绑定主线程的 Looperhandler = object : Handler(mainLooper) {// 重写 handleMessage() 方法,编写消息处理逻辑override fun handleMessage(msg: Message) {super.handleMessage(msg)when (msg.what) {1 -> {binding.textView.text = msg.arg1.toString()}2 -> {val intent = Intent(this@MainActivity, MainActivity2::class.java)startActivity(intent)}}}}// 开启子线程Thread {for (i in 5 downTo 1) {val msg = Message.obtain(handler, 1)msg.arg1 = i// 通过 sendMessage() 发送消息handler.sendMessage(msg)try {Thread.sleep(1000)} catch (e: InterruptedException) {e.printStackTrace()}}val msg = Message.obtain(handler, 2)// 通过 sendMessage() 发送消息handler.sendMessage(msg)}.start()}
}

3.2.2、使用 Handler.post() 发送消息

package com.example.handlertestimport android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.handlertest.databinding.ActivityMainBinding
import android.os.Handlerclass MainActivity : AppCompatActivity() {private lateinit var handler: Handleroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)// 在主线程中创建 handler,并绑定主线程的 Looperhandler = Handler(mainLooper)// 开启子线程Thread {for (i in 5 downTo 1) {// 通过 post() 发送消息,需要传入一个 Runnable 对象,在 Runnable 的 run() 方法中指定 UI 操作内容// 此处使用了 lambda 表达式handler.post { binding.textView.text = i.toString() }try {Thread.sleep(1000)} catch (e: InterruptedException) {e.printStackTrace()}}// 通过 post() 发送消息handler.post {val intent = Intent(this@MainActivity, MainActivity2::class.java)startActivity(intent)}}.start()}
}
http://www.tj-hxxt.cn/news/40001.html

相关文章:

  • 河北邢台地震手机网站怎么优化
  • 金华网站开发公司信息流广告有哪些投放平台
  • 哪家网站做旅游攻略好重庆关键词优化服务
  • 做设计专业的能做网站吗网络营销模式案例
  • 电子商务网站建设的过程和步骤百度下载应用
  • 太原免费网站建设免费网站建设平台
  • 武汉网站设计武网站seo专员招聘
  • 成人本科读出来有用吗四川二级站seo整站优化排名
  • wordpress全站ajax主题朋友圈广告推广
  • 漳州专业网站建设市场调研数据网站
  • 罗定城乡建设规划局网站关键词排名优化易下拉软件
  • uzi视频网站谁做的app推广有哪些渠道
  • 旅行社网站建设规划的内容国外免费网站服务器
  • 网站建设全网营销客户资源优化服务公司
  • 什么软件可以做app怎么seo网站关键词优化
  • 培训网站模板免费廊坊网站建设公司
  • 翔安区建设网站武汉久都seo
  • 哪个公司的网站做的好扬州网站推广公司
  • 做日本暖暖小视频网站长沙营销推广
  • 流速cms是什么意思天津百度快照优化公司
  • wordpress 密码忘记了seo推广软件排名
  • 专门做网站的软件百度app关键词优化
  • 推广网站优化seo教程上排名站长工具seo综合查询烟雨楼
  • 做淘客网站要多大的服务器seo网站推广多少钱
  • 做外包的网站有哪些问题网页设计制作网站图片
  • 浏览器禁止网站怎么做微帮推广平台怎么加入
  • 外贸soho做网站怎么做seo网站推广培训
  • wordpress大前端5.0搜索引擎排名优化价格
  • 怎样做建网站做淘客有友情链接的网站
  • 网络下载的网站模板能直接上传到虚拟主机做网络推广的团队