- 博客(22)
- 收藏
- 关注
翻译 Jetpack Compose 的阶段
与大多数其他 UI 工具包一样,Compose 通过几个不同的阶段来渲染一帧画面。例如,Android View 系统有三个主要阶段:测量、布局和绘制。Compose 与之非常相似,但在最开始多了一个重要的阶段:组合。
2026-03-29 21:24:39
49
原创 Compose 中的 Side-effects
Compose App 使用各种 Effect API 来获得更可预测的行为和适当的生命周期管理。Side-effect 是在 composable 函数 scope 之外发生的应用程序状态变化。由于 composables 的生命周期以及诸如不可预测的重组,以不同顺序执行 composables 的重组,或者可能被丢弃的重组等特性,在理想情况下,composables 中应该没有 Side-effect 的代码。
2026-03-29 17:30:04
394
原创 Compose 中的 modifier
Modifiers 让你可以修饰或增强 composable。Modifiers 是标准的 Kotlin 对象。在上面的代码中,请注意一起使用的不同的 modifer 函数。最佳实践是让所有 composables 接受一个 modifer 参数,并将该 modifer 传递给 emit UI 的第一个子组件。这样做可以使代码更具可重用性,并使其行为更可预测和直观。
2026-03-29 07:47:27
405
原创 Composables 的生命周期
这种行为有时是需要的,但在某些情况下,它可能会导致不想要的行为。如果在重组过程中,某个 composable 调用的 composables 与上一次组合时不同,Compose 会识别出哪些 composables 被调用了、哪些没有被调用,而对于在两次组合中都被调用的 composables ,如果它们的输入没有变化,Compose 不会重组它们。如果有一部新电影被添加到列表的末尾,Compose 可以重用组合中已有的实例,因为这些实例在列表中的位置没有改变,因此,对于这些实例来说,电影输入是相同的。
2026-03-29 07:15:03
385
原创 Jetpack Compose 中的状态
应用中的状态(State)是指任何随时间变化的值。这是一个非常宽泛的定义,涵盖了从 Room 数据库到类中的变量等所有内容。所有 Android App 都会向用户展示状态。Jetpack Compose 帮助你明确在 Android App 中存储和使用状态的位置及方式。本篇重点介绍状态与 composables 之间的联系,以及 Jetpack Compose 提供的方便处理状态的 API。
2026-03-28 15:34:46
381
原创 Thinking in Compose
Jetpack Compose 是 Android 声明式 UI 工具包。它提供了声明式 API,让你无需通过命令式地修改前端视图就能渲染 UI,从而简化了 UI 的编写和维护工作。
2026-03-28 10:42:28
368
原创 在 mac 上 clone github 上的项目时让输入的用户名密码是什么?
用户名密码= Personal Access Token (不是网页登录密码)最佳实践= 配置 SSH Key 免密登录。
2026-03-21 08:12:08
474
原创 C++学习笔记(四)
lambda 表达式的定义必须以方括号([])打头。这些括号告诉编译器,接下来是一个 lambda 表达式。方括号的后面是一个参数列表,该参数列表与不使用 lambda 表达式时提供给operator() 的参数列表相同。查找、搜索、删除和计数是一些通用算法,其应用范围很广。STL 通过通用的模板函数提供了这些算法以及其他的很多算法,可通过迭代器对容器进行操作。要使用 STL 算法,程序员必须包含头文件 <algorithm>。
2026-02-28 09:07:12
643
原创 C++学习笔记(三)
在查找方面,map 的复杂度为对数,即所需的时间与 map 包含的元素数的对数成反比。还意味着不像 vector 那样可以使用其他元素替换给定位置的元素,位于 map 中特定位置的元素不能替换为值不同的新元素,这是因为 map 将把新元素同二叉树中的其他元素进行比较,进而将它放在其他位置。给 vector 添加元素时,应首选 push_back(),insert()可能是效率最低的(插入位置不是末尾时),因为在开头或中间插入元素时,将导致 vector 类将后面的所有元素后移(为要插入的元素腾出空间)。
2026-02-26 22:09:04
591
原创 C++学习笔记(二)
C++ 增大了对字面量的支持力度,让您能够自定义字面量。例如,编写热力学方面的科学应用程序时,对于所有的温度,您都可能想以卡尔文为单位来存储和操作它们。通过使用自定义的字面量_F 和 C_,您让应用程序更容易理解和维护得多。
2026-02-26 09:20:30
303
原创 C语言—指针与函数指针
答案是为了告诉编译器指针所指向的数据的类型,int* 类型的指针,编译器解引用时会读取4字节(int 的大小),double* 类型的指针,编译器解引用时会读取 8 字节(double 的大小)。这里用了两种不同的方法来交换两个变量的值,使用 swap(&m, &n) 函数相信你已经非常熟悉了,但实际上你可能并不懂它,在 C 语言中,函数名本身就是一个指针,所以这里的 swap 实际上是一个指向函数的指针。这里的 & 操作符是取地址符,用于获取 number 在内存中的地址,打印出来是一个十六进制的地址。
2026-02-25 08:03:14
606
原创 如何分析ANR
一般发生 ANR 后,系统会生成一份 anr 日志文件到 /data/anr/ 目录下,业内大多称呼为 trace 文件。从这里基本就可以确定出这个 ANR 在哪里产生的(com.example.test.MainActivity),怎么触发的(ACTION_DOWN),但是一般的 ANR 不会这么容易分析。在模拟器上运行后,先点击第一个按钮,然后马上点击第二个按钮,过几秒后就会弹出 ANR 的弹框。ANR 会在日志中生成一条关键字为 ANR 的错误信息,可以通过过滤 ANR 字段来查看日志。
2026-01-31 10:20:18
563
原创 自动化打包
assembleRelease 和 assembleDebug 是 Android Gradle Plugin(AGP)根据你项目中定义的 构建变体(Build Variants) 自动生成的 Gradle 任务,专门用于构建对应类型的 AAR(或 APK)包。这样既能保证安全性,又能实现自动化构建和发布。不要将签名密码写死在 build.gradle 并提交到 Git,应该使用 ~/.gradle/gradle.properties 或项目根目录的 local.properties(
2025-11-29 21:39:45
898
翻译 StateFlow 和 SharedFlow
StateFlow 和 SharedFlow 可以让流以最优的方式发射 状态更新 和发射 值 给多个消费者。
2024-09-23 10:53:53
283
原创 CountDownLatch
CountDownLatch是JDK提供的一个同步工具,它可以让一个或多个线程等待,直到其他线程执行完一系列操作后再继续执行。
2023-08-14 22:13:06
163
原创 在Android Studio下进行NDK开发
JNI的全称就是Java Native Interface,其实它就是一种协议。一说协议,那它就是对某种东西的一个规范和约束,说的好听一点就是标准化。意思是如果你想用我这个东西,那你必须要遵守我这边的规范。有了JNI这个协议,Java和C/C++代码才能相互调用。NDK全称是Native Development Kit,它就是一个本地开发的“工具包”。Java开发要使用JDK,Android开发要使用SDK,那我们在Android中要进行native开发,也要用到它对应的工具包,即NDK。
2023-06-24 17:25:15
2270
原创 ContentProvider讲解与实例应用
A进程插入数据到数据库,步骤如下1.创建数据库表:package com.example.demoaimport android.content.Contextimport android.database.sqlite.SQLiteDatabaseimport android.database.sqlite.SQLiteOpenHelperprivate const val DB_NAME ="weather_provider.db"const val TABLE_NAME ="we
2022-03-16 17:23:57
5187
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅