自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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++学习笔记(一)

使用 #define 定义常量的做法已被摒弃,因此不应采用这种做法。

2026-02-25 20:06:29 580

原创 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

原创 DiffUtil

DiffUtil 是一个用于计算两个列表之间差异的工具类,主要是配合 RecyclerView 使用的。

2025-11-04 22:21:18 771

翻译 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

原创 HandlerThread的使用和原理

HandlerThread的使用和原理

2022-10-13 22:04:43 1184

原创 设计模式:静态代理模式(Proxy Pattern)

设计模式:静态代理模式(Proxy Pattern)

2022-08-15 20:56:28 166

原创 AIDL的使用

AIDL的使用

2022-08-02 11:27:03 696

原创 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关注的人

提示
确定要删除当前文章?
取消 删除