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
相关文章:
Android 之 kotlin 语言学习笔记四(Android KTX)
一、Android KTX 简介 Android KTX 是包含在 Android Jetpack 及其他 Android 库中的一组 Kotlin 扩展程序。KTX 扩展程序可以为 Jetpack、Android 平台及其他 API 提供简洁的惯用 Kotlin 代码。为此,这些扩展程序利用了多种 Kotlin 语言功能,其中包括&…...

适用于vue3的大屏数据展示组件库DataV(踩坑版)
踩坑版 如果按照官网(https://datav-vue3.jiaminghi.com/)的vue3安装有问题 官网是将dataview/datav-vue3 安装为本地依赖 npm install dataview/datav-vue31、跑起来报错(报错信息忘记保留了) 有人说找到node_modules, 安装成功后会有这个…...
mysql实现分页查询
文章目录 mysql实现分页查询1. 使用LIMIT和OFFSET2. 使用计算OFFSET的函数(适用于动态分页)3. 使用MySQL的变量(适用于存储过程) 获取所有用户数据并分页 mysql实现分页查询 在MySQL中实现分页查询,通常我们会使用LIM…...
Flink checkpoint
对齐检查点 (Aligned Checkpoint) Flink 的分布式快照机制受到 Chandy-Lamport 算法的启发。 其核心元素是数据流中的屏障(Barrier)。 Barrier 注入 :JobManager 中的 Checkpoint Coordinator 指示 Source 任务开始 Checkpoint。Source 任务…...
【java】在springboot中实现证书双向验证
证书生成 public static void main(String[] args) throws Exception {// 生成密钥对KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);KeyPair keyPair keyPairGenerator.generateKeyPair();// 获取私…...
CppCon 2015 学习:Functional Design Explained
这两个 C 程序 不完全相同。它们的差异在于对 std::cout 的使用和代码格式。 程序 1: #include <iostream> int main(int argc, char** argv) {std::cout << "Hello World\n"; }解释:这个程序是 正确的。std::cout 是 C 标准库中…...

基于3D对象体积与直径特征的筛选
1,目的 筛选出目标3D对象。 效果如下: 2,原理 使用3D对象的体积与直径特征进行筛选。 3,代码解析 3.1,预处理2.5D深度图。 * 参考案例库:select_object_model_3d.hdev * ****************************…...
GIT - 如何从某个分支的 commit创建一个新的分支?
如果上一个Release 分支被污染了,想要还原这个分支最原始的样子,有什么办法或者说该怎么办呢?简单来说,就是如何从某个指定的 commit 创建一个新的 Git 分支? 操作非常简单! 命令格式 git branch <ne…...
Claude vs ChatGPT vs Gemini:功能对比、使用体验、适合人群
随着AI应用全面进入生产力场景,市面上的主流AI对话工具也进入“三国杀”时代: Claude(Anthropic):新锐崛起,语言逻辑惊艳,Opus 模型被称为 GPT-4 杀手ChatGPT(OpenAI)&a…...
线程基础编程
早期的计算机只能执行一个任务,一旦任务完成,计算机就会等待下一个任务。这种模型效率低下,无 法充分利用计算机的性能。 随着计算机技术的发展,操作系统开始支持多进程模型,即同时执行多个任务。每个任务被称为一个进…...

DJango项目
一.项目创建 在想要将项目创键的目录下,输入cmd (进入命令提示符)在cmd中输入:Django-admin startproject 项目名称 (创建项目)cd 项目名称 (进入项目)Django-admin startapp 程序名称 (创建程序)python manage.py runserver 8080 (运行程序)将弹出的网址复制到浏览器中…...
深入了解JavaScript当中如何确定值的类型
JavaScript是一种弱类型语言,当你给一个变量赋了一个值,该值是什么类型的,那么该变量就是什么类型的,并且你还可以给一个变量赋多种类型的值,也不会报错,这就是JavaScript的内部机制所决定的,那…...

excel数据对比找不同:6种方法核对两列数据差异
工作中,有时需要核对两列数据的差异,用于对比、复核等。数据较少的情况下差异肉眼可见,数据量较大时用什么方法比较好呢?从个人习惯出发,我整理了6种方法供参考。 6种方法核对两列数据差异: 1、Ctrl G定位…...

基于智能代理人工智能(Agentic AI)对冲基金模拟系统:模范巴菲特、凯西·伍德的投资策略
股票市场涉及众多统计数据和模式。股票交易基于研究和数据驱动的决策。人工智能的使用可以实现流程自动化,让投资者在研究上花费更少的时间,同时提高准确性。这使他们能够更加专注于监督实际交易和服务客户。 顶尖对冲基金经理发挥着至关重要的作用&…...

MySQL数据库基础(二)———数据表管理
前言 上篇文章介绍了MySQL数据库以即数据库的管理 这篇文章将给大家讲解数据表的管理 一、数据表常见操作 数据表常见操作的指令 进入数据库use数据库; 查看当前所有表:show tables; 创建表结构 1.创建表操作 1.1创建表 create table 表名(列名 …...
如何在Lyra中创建一个新的Game Feature Plugin和Experience游戏体验
目录 -1.前言0.预备知识1.创建一个新的Game Feature Plugin插件2.创建Lyra Pawn Data Asset3. 创建Lyra Experience Definition4. 创建自定义关卡5. 设置资产管理器Asset Manager引用6. 创建Lyra User Facing Experience Definition7. 在编辑器中运行测试后记-1.前言 由于转职…...

RDMA简介5之RoCE v2队列
在RoCE v2协议中,RoCE v2队列是数据传输的最底层控制机制,其由工作队列(WQ)和完成队列(CQ)共同组成。其中工作队列采用双向通道设计,包含用于存储即将发送数据的发送队列(SQ…...

SAFe/LeSS/DAD等框架的核心适用场景如何选择?
在敏捷开发的规模化实践中,SAFe(Scaled Agile Framework)、LeSS(Large Scale Scrum)和DAD(Disciplined Agile Delivery)是三大主流框架。它们分别以不同的哲学和方法论应对复杂性、协作与交付的…...
鸿蒙应用开发之uni-app x实践
鸿蒙应用开发之uni-app x实践 前言 最近在开发鸿蒙应用时,发现uni-app x从4.61版本开始支持纯血鸿蒙(Harmony next),可以直接编译成ArkTS原生应用。这里记录一下开发过程中的一些经验和踩过的坑。 一、环境搭建 1.1 开发工具 …...

window查看SVN账号密码
背景 公司的SVN地址发生迁移,想迁移一下本地SVN地址,后来发现SVN账号密码忘记了。写此文章纯记录。 迁移SVN地址: 找到svn目录点击relocate,输入新的svn地址,如需输入账号密码,输入账号密码即完成svn地址…...
Python训练营---Day44
DAY 44 预训练模型 知识点回顾: 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战:resnet18 作业: 尝试在cifar10对比如下其他的预训练模型,观察差异,尽可能和他人选择的不同尝试通…...

前端项目初始化
目录 1. 安装 nvm 2. 配置 nvm 并切换到 Node.js 16.15.0 3. 安装 LightProxy 代理 4. GIT安装 1. 配置用户名和邮箱(这些信息将用于您在提交代码时的标识): 2. 生成SSH密钥(用于将本地代码仓库与远程存储库连…...

USB扩展器与USB服务器的2个主要区别
在现代办公和IT环境中,连接和管理USB设备是常见需求。USB扩展器(常称USB集线器)与USB服务器(如朝天椒USB服务器)是两类功能定位截然不同的解决方案。前者主要解决物理接口数量不足的“近身”连接扩展问题,而…...

第46节:多模态分类(图像+文本)
一、多模态分类概述 多模态分类是指利用来自不同模态(如图像、文本、音频等)的数据进行联合分析和分类的任务。 在当今大数据时代,信息往往以多种形式存在,例如社交媒体上的图片配文字、视频附带字幕、医疗检查中的影像与报告等。单一模态的数据往往只能提供有限的信息,…...
spring获取注册的bean并注册到自定义工厂中管理
背景 在开发的时候,对于同一个对象的按照某个字段的不同有很多的处理方式。想着开发一个类似于工厂模式,由上层工厂统一分配。 由于是基于springboot开发,所以有很多自动注入的对象,如果由工厂统一创建new对象的方式,那…...
IDEA 中 Maven Dependencies 出现红色波浪线的原因及解决方法
在使用 IntelliJ IDEA 开发 Java 项目时,尤其是基于 Maven 的项目,开发者可能会遇到 Maven Dependencies 中出现红色波浪线的问题。这种现象通常表示项目依赖未能正确解析或下载,导致代码提示错误、编译失败等问题。本文将详细分析该问题的常…...

springMVC-10验证及国际化
验证 概述 ● 概述 1. 对输入的数据(比如表单数据),进行必要的验证,并给出相应的提示信息。 2. 对于验证表单数据,springMVC提供了很多实用的注解, 这些注解由JSR303 验证框架提供. ●JSR 303 验证框架 1. JSR 303 的含义 JSR࿰…...
使用Python和TensorFlow实现图像分类
最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…...

LRU 和 DiskLRU实现相册缓存器
我是写Linux后端的(golang、c、py),后端缓存算法通常是指的是内存里面的lru、或diskqueue,都是独立使用。 很少有用内存lru与disklru结合的场景需求。近段时间研究android开发,里面有一些设计思想值得后端学习。 写这…...

figma MCP + cursor如何将设计稿生成前端页面
一、准备工作 figma MCP需要通过figma key来获取设计稿权限,key的生成步骤如下 1. 打开figma网页版/APP,进入账户设定 2. 点击生成token 3. 填写内容生成token(一定要确认复制了,不然关闭弹窗后就不会显示了) 二、配置MCP 4. 进入到cursor…...