张可的博客

博客迁移通知

该博客永久迁移至 https://zhangke.space/ 该博客永久迁移至 https://zhangke.space/ 该博客永久迁移至 https://zhangke.space/

WordPress 搭建个人博客指南

WordPress 搭建个人博客指南

Kotlin-Serialization 介绍,Kotlin 上最好用的序列化工具

介绍

日本自由行-攻略&游记

签证

Compose最强导航框架 Voyager 完全使用指南

Voyager 是一个专为 Compose 页面导航编写的框架,类似于 Jetpack Navigation,但它支持 Compose 跨平台,以 API 简洁好用而广受好评,我之前用的也是 Jetpack Navigation,后面转到 Voyager 之后就再也回不去了,API 设计的非常巧妙,文档很详细,社区也很活跃。

[LeetCode]-1,字符串相乘/跳跃游戏2/螺旋矩阵/简化路径

今年打算重新开始刷题了,会保持每周至少两题,我会隔段时间写一篇文章记录最近刷的题和题解思路。

Clean 架构下的现代 Android 架构指南

Clean 架构是 Uncle Bob 提出的一种软件架构,Bob 大叔同时也是 SOLID 原则的命名者。

【Compose】平滑的解决圆角矩形长度过短的显示问题

最近在用到圆角矩形时发现一个问题,如果控件宽度太小,小于圆角直径的话,Compose 会做一些特殊的处理,即按照比例缩小圆角半径,让其仍然看起来是个圆角矩形,如下图。

[KRouter] 一个简单轻量的 Kotlin 路由框架

KRouter(Kotlin-Router) 是一个非常轻量级的 Kotlin 路由框架。

使用 Compose 绘制渐变贝塞尔曲线趋势图

要么说 Compose 优雅呢,假如你想画个东西,用安卓 View 的话你要继承 View 并且实现其中的 onDraw 方法,然后才能拿到 Canvas 开始绘制,但 Compose 你只需要这样:

Compose 实现 CollapsableTopBarLayout 以及结合 MotionLayout 使用

虽然 Android 提供了 CollapsingToolbarLayout,但是 Compose 并没有这个组件,好在 Compose 实现起来并不困难,借助 Compose 嵌套滚动的 Api 可以轻易实现,先看下效果图。

亲手封装一个简单灵活的下拉刷新上拉加载 Compose Layout

亲手封装一个简单灵活的下拉刷新上拉加载 Compose Layout

MVI 架构在 Compose 中的事件处理方式

MVI

【Filt】KSP 初探之自动生成 Hilt MultiBindings

Filt 是 Fill+Hilt 的意思,用于简化在使用 Hilt 时注入接口所有的实现类的操作。

人工智能简要发展史

人工智能简要发展史

一种 Kotlin suspend 函数结合 Retrofit 使用的姿势

在 Kotlin 协程以前我们在使用 Retrofit 的时候一般会结合 RxJava 一起使用,通过 Single 来表示一个已经创建的请求。

用 Compose 做了个开源的轻量级的 Notion 客户端 NotionLight,现已上架 Google Play。

迫于 Notion 的客户端比较慢,而且操作路径有点长,如果想当做快速笔记或者 TODO 来用还是不太够。

Atom 协议标准中文版

最近准备做一些 RSS 相关的工作,但是发现除了 RSS 协议之外官方还提供了个 Atom 协议,算是继承自 RSS 并且进行了一些扩展,相对要比 RSS 复杂很多,而网上也没找到中文资料,阅读文档的时候就想着看都看了,那就顺便(并不)翻译成中文吧。

计算机科学发展史

摘要 本文准主要介绍计算机这门学科的理论发展史,从计算机理论模型的设想开始到通用计算机的实现,以及关于下一代计算机的思考。笔者一直认为不管是学习什么学科,其发展史都是非常有必要的,只有了解了这个学科从零开始发展到现在的过程,才能对整体有更深刻的理解。另外本文也不会涉及太多硬件方面迭代发展的描述。

HashMap 使用与分析

HashMap HashMap 实现了 Map 接口,用于存储键值对,与 Hashtable 不同的是,HashMap 允许 null 元素。

Hashtable 使用与分析

Hashtable Hashtable 实现了 Map 接口,用于存储键值对,禁止 null 元素。

LinkedBlockingDeque 使用与分析

LinkedBlockingDeque LinkedBlockingDeque 是基于链表的双端阻塞队列,线程安全,元素不允许为 null。

ConcurrentLinkedDeque 使用与分析

ConcurrentLinkedDeque ConcurrentLinkedDeque 是基于链表的无限双端队列,线程安全,不允许 null 元素。

ArrayDeque 使用与分析

ArrayDeque ArrayDeque 是 Java 集合中双端队列的数组实现,双端队列的链表实现(LinkedList)我们在前几篇文章中讲过了。

CopyOnWriteArrayList 使用与分析

CopyOnWriteArrayList 先看看百科上关于 COW 的介绍: 写入时复制(英语:Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的(transparently)。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。 简单来说,就是读取时直接读取不用加锁同步,写入数据时会复制一份副本,然后将新的数据写入到副本中,然后再把副本替换成原来的数据。

ArrayList 使用与分析

List 先看下 ArrayList 实现的接口 List 的相关概念。 List 可以称为有序集合或者序列,通过整数索引访问元素 允许插入相同元素 一般来说也允许插入 null 值 List 接口中还提供了一个特殊的迭代器:ListIterator

LinkedList 使用与分析

LinkedList 实现了 List 以及 Deque 的双向链表,元素允许为 null,所以 LinkedList 同时具备 List 以及 Deque 的特性。 跟 ArrayList 一样,LinkedList 也是非线程安全的,可以使用包装方法获取同步对象: List list = Collections.synchronizedList(new LinkedList(...)); iterator以及listIterator同样也被设计为 fail-fast。 使用特性 LinkedList 内部实现上是个链表,所以可以把它当作链表使用。

回溯法:N皇后与解数独

好久没写博客了,最近比较忙,在系统学习一些知识,没学完之前不太容易输出高质量文章,等过段时间学完了再整理一下写几篇文章出来。

注解处理器(APT)了解一下

基本概念 APT 全称为 Annotation Processing Tool,可翻译为注解处理器,APT 工具是用于注解处理的命令行程序,它可以找到源码中对应注解的对象并使用注解处理器对其进行处理。 一般来说,我们会使用 APT 生成一些源码,然后加入编译目录进行编译,从而简化开发周期。

Gradle 依赖与插件

关于 Gradle 中的基础、Task 等知识,可以看我的上一篇文章。

Gradle 扫盲与 Task 基础

Gradle 是用于构建项目的工具,除了管理依赖库之外,Gradle 还支持我们自己添加编译脚本、添加编译配置等控制项目的构建,通过提供 API 我们可以控制编译的每一步操作。

OkHttp 源码分析

流程分析 我们从一个简单的 HTTP 请求开始: client = new OkHttpClient(); Request request = new Request.Builder().url("your url").build(); //同步发起请求 Response syncResponse = client.newCall(request).execute(); //异步发起请求 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { } @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { } });

Android Matrix 详解

我们在自定义 View 控件时随处可见 Matrix 的身影,主要用于坐标转换映射,我们可以通过 Matrix 矩阵来控制视图的变换。

Android 多点触控及应用(画板控件 DrawView)

多指触控是指监听多个手指的触控事件,我们可以重写 View 中的 onTouchEvent 方法,或者使用 setOnTouchListener 方法来处理触摸事件。

Glide 源码分析解读-缓存模块-基于最新版Glide 4.9.0

缓存模块

Glide 源码分析解读-基于最新版Glide 4.9.0

项目编译 项目基于最新版 Glide 4.9.0 源码分析,通过如下方式获取并编译代码: git clone https://github.com/bumptech/glide.git cd glide ./gradlew jar

【QRCodeView】更专注的二维码扫描控件

QRCodeView 基于 com.google.zxing 开发,用于简化 Android 设备扫描、生成二维码等操作。

Handler 机制深入理解(Handler、Looper、MessageQueue)

Handler Handler 主要用于在不同的线程中相互通信,使用场景最多的应该就是在子线程中更新 UI。 与 Handler 相关的类: Handler:处理与发送消息(Message) Message:消息的包装类 Looper:整个 Handler 通信的核心,接受 Handler 发送的 Message,循环遍历 MessageQueue 中的 Message,并发送至 Handler 处理 MessageQueue:保存 Message LocalThread:存储 Looper 与 Looper所在线程的信息