Android 之 kotlin 语言学习笔记四(Android KTX)

一、Android KTX 简介

  • Android KTX 是包含在 Android Jetpack 及其他 Android 库中的一组 Kotlin 扩展程序。KTX 扩展程序可以为 Jetpack、Android 平台及其他 API 提供简洁的惯用 Kotlin 代码。为此,这些扩展程序利用了多种 Kotlin 语言功能,其中包括:扩展函数、扩展属性、Lambda、命名参数、参数默认值、协程
  • 使用 lambda 传递代码、使用可以替换的合理默认值,使用 inline 扩展函数,将这些行为添加到现有 API 中,这种模式是 Android KTX 库提供的典型增强功能。
	// 未使用 Android KTX 前实现模式sharedPreferences.edit()  // create an Editor.putBoolean("key", value).apply() // write to disk asynchronously// Android KTX 模式// SharedPreferences.edit extension function signature from Android KTX - Core// inline fun SharedPreferences.edit(//         commit: Boolean = false,//         action: SharedPreferences.Editor.() -> Unit)// Commit a new value asynchronouslysharedPreferences.edit { putBoolean("key", value) }// Commit a new value synchronouslysharedPreferences.edit(commit = true) { putBoolean("key", value) }
  • SharedPreferences.edit() 方法包含 inline 关键字。此关键字向 Kotlin 编译器表明,每次使用函数时,它都应该为函数复制并粘贴(或内嵌)编译的字节码。这样可避免每次调用此函数时都为每个 action 实例化一个新类所产生的开销。

二、AndroidX 模块

  • Android KTX 分为若干模块,每个模块包含一个或多个软件包。
  • 必须在应用的 build.gradle 文件中为每个模块添加一个依赖项,并在模块后面附上版本号。
  • Android KTX 包含一个核心模块,该模块可为通用框架 API 提供 Kotlin 扩展程序,而且还能提供一些领域专用的扩展程序。
  • 除了核心模块之外,所有 KTX 模块都会替换 build.gradle 文件中的底层 Java 依赖项。例如,您可以将 androidx.fragment:fragment 依赖项替换为 androidx.fragment:fragment-ktx。

1、Core KTX

  • Core KTX 模块为 Android 框架的通用库 提供扩展程序。
  • 要使用此模块,需在应用的 build.gradle 文件中添加相应的依赖项。
	dependencies {implementation("androidx.core:core-ktx:1.16.0")}
  • 下面列出了 Core KTX 模块中包含的软件包:
    • androidx.core.animation
    • androidx.core.content
    • androidx.core.content.res
    • androidx.core.database
    • androidx.core.database.sqlite
    • androidx.core.graphics
    • androidx.core.graphics.drawable
    • androidx.core.location
    • androidx.core.net
    • androidx.core.os
    • androidx.core.text
    • androidx.core.transition
    • androidx.core.util
    • androidx.core.view
    • androidx.core.widget

2、Collection KTX

  • Collection 扩展程序包含集合库(在Android 中节省内存的)中使用的实用函数,包括 ArrayMap、LongSparseArray、LruCache 等等。
  • 要使用此模块,需在应用的 build.gradle 文件中添加相应的依赖项。
	dependencies {implementation("androidx.collection:collection-ktx:1.3.0")}
  • Collection 扩展程序利用 Kotlin 的运算符重载简化集合串联等操作
	// Combine 2 ArraySets into 1.val combinedArraySet = arraySetOf(1, 2, 3) + arraySetOf(4, 5, 6)// Combine with numbers to create a new sets.val newArraySet = combinedArraySet + 7 + 8

3、Fragment KTX

  • Fragment KTX 模块提供了一系列扩展程序以简化 Fragment API。
  • 要使用此模块,需在应用的 build.gradle 文件中添加相应的依赖项。
	dependencies {implementation("androidx.fragment:fragment-ktx:1.6.2")}
  • 借助 Fragment KTX 模块,可以使用 lambda 来简化 Fragment 事务。
	fragmentManager().commit {addToBackStack("...")setCustomAnimations(R.anim.enter_anim,R.anim.exit_anim)add(fragment, "...")}
  • 还可以使用 viewModels 和 activityViewModels 属性委托在一行中绑定到 ViewModel。
	// Get a reference to the ViewModel scoped to this Fragmentval viewModel by viewModels<MyViewModel>()// Get a reference to the ViewModel scoped to its Activityval viewModel by activityViewModels<MyViewModel>()

4、Lifecycle KTX

  • Lifecycle KTX 为每个 Lifecycle 对象定义一个 LifecycleScope。在此范围内启动的协程会在 Lifecycle 被销毁时取消。您可以使用 lifecycle.coroutineScope 或 lifecycleOwner.lifecycleScope 属性访问 Lifecycle 的 CoroutineScope。
  • 要使用此模块,需在应用的 build.gradle 文件中添加相应的依赖项。
	dependencies {implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")}
  • 使用 lifecycleOwner.lifecycleScope 异步创建预计算文本:
	class MyFragment: Fragment() {override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)viewLifecycleOwner.lifecycleScope.launch {val params = TextViewCompat.getTextMetricsParams(textView)val precomputedText = withContext(Dispatchers.Default) {PrecomputedTextCompat.create(longTextContent, params)}TextViewCompat.setPrecomputedText(textView, precomputedText)}}}

5、LiveData KTX

  • 使用 LiveData 时,您可能需要异步计算值。例如,您可能需要检索用户的偏好设置并将其传送给界面。在这些情况下,LiveData KTX 可提供一个 liveData 构建器函数,该函数会调用 suspend 函数,并将结果作为 LiveData 对象传送。
  • 要使用此模块,需在应用的 build.gradle 文件中添加相应的依赖项
	dependencies {implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.2")}
  • 可以使用 liveData 构建器函数异步调用 loadUser(),然后使用 emit() 来发出结果:
	val user: LiveData<User> = liveData {val data = database.loadUser() // loadUser is a suspend function.emit(data)}

6、Navigation KTX

  • Navigation 库的每个组件都有自己的 KTX 版本,用于调整 API 以使其更简洁且更符合 Kotlin 的语言习惯。
  • 要使用此模块,需在应用的 build.gradle 文件中添加相应的依赖项
	dependencies {implementation("androidx.navigation:navigation-runtime-ktx:2.7.5")implementation("androidx.navigation:navigation-fragment-ktx:2.7.5")implementation("androidx.navigation:navigation-ui-ktx:2.7.5")}
  • 可以使用扩展函数和属性委托来访问目标参数并导航到目标:
	class MyDestination : Fragment() {// Type-safe arguments are accessed from the bundle.val args by navArgs<MyDestinationArgs>()...override fun onViewCreated(view: View, savedInstanceState: Bundle?) {view.findViewById<Button>(R.id.next).setOnClickListener {// Fragment extension added to retrieve a NavController from// any destination.findNavController().navigate(R.id.action_to_next_destination)}}...}

7、Palette KTX

  • Palette KTX 模块为使用调色板提供惯用的 Kotlin 支持。
  • 要使用此模块,需在应用的 build.gradle 文件中添加相应的依赖项
	dependencies {implementation("androidx.palette:palette-ktx:1.0.0")}
  • 使用 Palette 实例时,可以使用 get 运算符 ([ ]) 来检索给定 target 的 selected 色样:
	val palette = Palette.from(bitmap).generate()val swatch = palette[target]

8、Reactive Streams KTX

  • 利用 Reactive Streams KTX 模块可根据 ReactiveStreams 发布程序来创建可监测的 LiveData 流。
  • 要使用此模块,需在应用的 build.gradle 文件中添加相应的依赖项
	dependencies {implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.6.2")}
  • 假设一个数据库只有很少的用户。在应用中,将该数据库加载到内存中,然后在界面中显示用户数据。为此,可以使用 RxJava、Room Jetpack 组件以 Flowable 的形式检索用户列表。在这种情况下,还必须在 Fragment 或 Activity 的整个生命周期内管理 Rx 发布程序订阅。
  • 不过,借助 LiveDataReactiveStreams,既可以利用 RxJava 及其丰富的运算符和工作安排功能,又可以享受 LiveData 的简便性:
	val fun getUsersLiveData() : LiveData<List<User>> {val users: Flowable<List<User>> = dao.findUsers()return LiveDataReactiveStreams.fromPublisher(users)}

9、Room KTX

  • Room 扩展程序增加了对数据库事务的协程支持。
  • 要使用此模块,需在应用的 build.gradle 文件中添加相应的依赖项
	dependencies {implementation("androidx.room:room-ktx:2.7.1")}
  • Room 使用协程的示例:第一个示例使用 suspend 函数返回 User 对象列表,而第二个示例利用 Kotlin 的 Flow 异步返回 User 列表。注意,使用 Flow 时,您还会收到有关您正在查询的表中任何更改的通知。
	@Query("SELECT * FROM Users")suspend fun getUsers(): List<User>@Query("SELECT * FROM Users")fun getUsers(): Flow<List<User>>

10、SQLite KTX

  • SQLite 扩展程序将与 SQL 相关的代码封装在事务中,从而避免编写大量样板代码。
  • 要使用此模块,需在应用的 build.gradle 文件中添加相应的依赖项
	dependencies {implementation("androidx.sqlite:sqlite-ktx:2.5.1")}

11、ViewModel KTX

  • ViewModel KTX 库提供了一个 viewModelScope() 函数,可让您更轻松地从 ViewModel 启动协程。CoroutineScope 绑定至 Dispatchers.Main,并且会在清除 ViewModel 后自动取消。您可以使用 viewModelScope(),而无需为每个 ViewModel 创建一个新范围。
  • 要使用此模块,需在应用的 build.gradle 文件中添加相应的依赖项
	dependencies {implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")}
  • 以下 viewModelScope() 函数会启动一个协程,用于在后台线程中发出网络请求。
	class MainViewModel : ViewModel() {// Make a network request without blocking the UI threadprivate fun makeNetworkRequest() {// launch a coroutine in viewModelScopeviewModelScope.launch  {remoteApi.slowFetch()...}}// No need to override onCleared()}

12、WorkManager KTX

  • WorkManager KTX 为协程提供一流的支持。
  • 要使用此模块,需在应用的 build.gradle 文件中添加相应的依赖项
	dependencies {implementation "androidx.work:work-runtime-ktx:2.9.0"}
  • 如果要构建一个简单的 CoroutineWorker 以执行某些网络操作,则需要执行以下操作:
	class CoroutineDownloadWorker(context: Context, params: WorkerParameters): CoroutineWorker(context, params) {override suspend fun doWork(): Result = coroutineScope {val jobs = (0 until 100).map {async {downloadSynchronously("https://www.google.com")}}// awaitAll will throw an exception if a download fails, which// CoroutineWorker will treat as a failurejobs.awaitAll()Result.success()}}

三、其他 KTX 模块

1、Firebase KTX

  • 部分适用于 Android 的 Firebase SDK 具有 Kotlin 扩展库,可让您在应用中使用 Firebase 时编写惯用 Kotlin 代码。

2、Google Maps Platform KTX

  • 有一些 KTX 扩展可用于 Google Maps Platform Android SDK,借助这些 KTX 扩展,您能够利用多种 Kotlin 语言功能(例如扩展函数、命名参数和默认参数),解构声明和协程。

3、Play Core KTX

  • Play Core KTX 通过向 Play Core 库中的 SplitInstallManager 和 AppUpdateManager 添加扩展函数,针对单发请求和用于监控状态更新的 Flow 添加了对 Kotlin 协程的支持。
  • 要使用此模块,需在应用的 build.gradle 文件中添加相应的依赖项
	dependencies {implementation "com.google.android.play:core-ktx:1.8.1"}
  • 用于监控状态的 Flow 的示例:
	// Inside of a coroutine...// Request in-app update status updates.manager.requestUpdateFlow().collect { updateResult ->when (updateResult) {is AppUpdateResult.Available -> TODO()is AppUpdateResult.InProgress -> TODO()is AppUpdateResult.Downloaded -> TODO()AppUpdateResult.NotAvailable -> TODO()}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生思维重塑数字化基座:从理念到实践的深度剖析

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;云原生为何成为数字化的“基础设施语言”&#xff1f; 随着5G、人工智能、物联网等技术逐步进入规模化落地阶段&am…

【C/C++】STL实现版本为什么比手写版本高?

文章目录 为什么标准库版本效率更高&#xff1f;1 具体介绍1.1 **内联优化&#xff08;Inlining&#xff09;和模板展开**1.2 **分支预测友好&#xff08;Branch Prediction&#xff09;**1.3 **迭代器解耦 静态分发**1.4 **代码紧凑&#xff0c;编译器优化空间大**1.5 **高质…

35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题

江科大学长又发布了第二期的编写技巧&#xff01; 大家可以看看&#xff1a;https://space.bilibili.com/383400717 最后面给了一个未完成的任务&#xff1a; 这里我已经把这个问题给解决了&#xff01; 总代码放在资源里面&#xff0c;key.c放在文章最后面&#xff01;同时感…

STM32什么是寄存器

提示&#xff1a;文章 文章目录 前言一、背景二、2.12.2 三、3.1 总结 前言 前期疑问&#xff1a; 1、什么是寄存器&#xff1f; 答&#xff1a;在4GB的地址空间中&#xff0c;512MB的block2上&#xff0c;每4个字节组成32位&#xff0c;这个32位为一个单元&#xff0c;控制&a…

【Pinia】Pinia和Vuex对比

Pinia 是 Vue 官方团队成员专门开发的一个全新状态管理库&#xff0c;并且 Vue 的官方状态管理库已经更改为了 Pinia。 在 Vuex 官方仓库中也介绍说可以把 Pinia 当成是不同名称的 Vuex 5&#xff0c;这也意味不会再出 5 版本了。 优点 1. 更加轻量级&#xff0c;压缩后提交只…

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…

Oracle双平面适用场景讨论会议

4月28日&#xff0c;我在杭州组织召开了Oracle双平面会议讨论沙龙。在国产化数据库浪潮的今天&#xff0c;Oracle数据库作为国产数据库的应急库&#xff0c;在国产数据库发生故障或者性能下降时&#xff0c;如何更好的使用Oracle。会议主题如下&#xff1a; 1、背景与痛点速览&…

10.Linux进程信号

1. 理解信号 信号VS信号量 老婆&#xff1a;老婆饼-》没有任何关系&#xff01;信号&#xff1a;闹钟&#xff0c;上课铃声&#xff0c;脸色...人-》进程&#xff1b;信号中断人正在做的事&#xff0c;是一种事件的异步通知机制&#xff1b; 我们自习一会&#xff0c;等张三回…

求解插值多项式及其余项表达式

例 求满足 P ( x j ) f ( x j ) P(x_j) f(x_j) P(xj​)f(xj​) ( j 0 , 1 , 2 j0,1,2 j0,1,2) 及 P ′ ( x 1 ) f ′ ( x 1 ) P(x_1) f(x_1) P′(x1​)f′(x1​) 的插值多项式及其余项表达式。 解&#xff1a; 由给定条件&#xff0c;可确定次数不超过3的插值多项式。…

C++刷题:日期模拟(1)

&#xff08;注&#xff1a;本文所展示代码均为本人所写&#xff0c;不一定为最优&#xff09; 我们首先用纯逻辑和手动计算来拆解日期模拟题&#xff0c;再来代码实现&#xff0c;看看这些问题的底层思路怎么玩明白&#xff5e; 一、基础日期计算&#xff1a;直接算“过几天是…

深入剖析Nginx:从入门到高并发架构实战

深入剖析Nginx&#xff1a;从入门到高并发架构实战 摘要&#xff1a;本文全面解析Nginx的核心功能、架构原理及实战配置&#xff0c;涵盖负载均衡、反向代理、动静分离等高级应用场景&#xff0c;助你构建高性能Web服务架构。 一、Nginx是什么&#xff1f;为什么它如此重要&…

Qt客户端技巧 -- 窗口美化 -- 圆角窗口

不解析&#xff0c;直接给代码例子 利用窗口重绘事件处理函数paintEvent main.cpp #include <QtCore/qglobal.h> #if QT_VERSION > 0x050000 #include <QtWidgets/QApplication> #else #include <QtGui/QApplication> #endif#include "roundedwin…

Three.js学习笔记-三要素

Three.js 学习笔记-三要素 一、Three.js 简介 (一)前世今生 Three.js 是一款运行在浏览器中的 3D 引擎,由 Ricardo Cabello(Mr.doob)在 2010 年 4 月于 GitHub 首次发布 。其起源可追溯到本世纪初,代码最初用 ActionScript 编写,2009 年移植到 JavaScript。随着 Web…

动力电池点焊机:驱动电池焊接高效与可靠的核心力量|比斯特自动化

在新能源汽车与储能设备需求激增的背景下&#xff0c;动力电池的制造工艺直接影响产品性能与安全性。作为电芯与极耳连接的核心设备&#xff0c;点焊机如何平衡效率、精度与可靠性&#xff0c;成为电池企业关注的重点。 动力电池点焊机的核心功能是确保电芯与极耳的稳固连接。…

OpenCV CUDA模块图像处理------创建一个模板匹配(Template Matching)对象函数createTemplateMatching()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 创建一个用于在 GPU 上执行模板匹配的 TemplateMatching 对象。 该函数返回一个指向 TemplateMatching 的智能指针&#xff08;Ptr&#xff09;…

natapp 内网穿透失败

连不上网络错误调试排查详解 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 如何将DNS服务器修改为114.114.114.114_百度知道 连不上/错误信息等问题解决汇总 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 nslookup auth.natapp.cnping auth.natapp.cn

游戏(game)

题目描述 小明最近迷上了一款游戏&#xff0c;并且很想成为这款游戏的高手&#xff0c;这款游戏需要用 资源来买装备。他刚开始的资源价值为0,于是他每天都会做日常任务来获得价值为1的资源。 这款游戏中有每日商店&#xff0c;小明已经提前知道了接下来n天会出现的装备&#x…

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…

关于脏读,幻读,可重复读的学习

mysql 可以查询当前事务隔离级别 默认是RR repeatable-read 如果要测脏读 要配成未提交读 RU 读到了未提交的数据。 3.演示不可重复读 要改成提交读 RC 这个是指事务还未结束&#xff0c;其他事务修改了值。导致我两次读的不一样。 4.RR–可以解决不可重复读 小总结&…

华为云Astro中服务编排、自定义模型,页面表格之间有什么关系?如何连接起来?如何操作?

目录 一、核心关系解析 二、连接方式与操作步骤 (一)服务编排与自定义模型的连接 (二)自定义模型与页面表格的连接 (三)服务编排与页面表格的连接 三、操作示例:构建数据处理闭环 场景:用户在页面表格中修改设备信息,触发服务编排校验数据并更新数据库。 四、…