Clean 架构是 Uncle Bob 提出的一种软件架构,Bob 大叔同时也是 SOLID 原则的命名者。
最近在用到圆角矩形时发现一个问题,如果控件宽度太小,小于圆角直径的话,Compose 会做一些特殊的处理,即按照比例缩小圆角半径,让其仍然看起来是个圆角矩形,如下图。
KRouter(Kotlin-Router) 是一个非常轻量级的 Kotlin 路由框架。
要么说 Compose 优雅呢,假如你想画个东西,用安卓 View 的话你要继承 View 并且实现其中的 onDraw 方法,然后才能拿到 Canvas 开始绘制,但 Compose 你只需要这样:
亲手封装一个简单灵活的下拉刷新上拉加载 Compose Layout
MVI
Filt 是 Fill+Hilt 的意思,用于简化在使用 Hilt 时注入接口所有的实现类的操作。
人工智能简要发展史
在 Kotlin 协程以前我们在使用 Retrofit 的时候一般会结合 RxJava 一起使用,通过 Single 来表示一个已经创建的请求。
迫于 Notion 的客户端比较慢,而且操作路径有点长,如果想当做快速笔记或者 TODO 来用还是不太够。
最近准备做一些 RSS 相关的工作,但是发现除了 RSS 协议之外官方还提供了个 Atom 协议,算是继承自 RSS 并且进行了一些扩展,相对要比 RSS 复杂很多,而网上也没找到中文资料,阅读文档的时候就想着看都看了,那就顺便(并不)翻译成中文吧。
摘要 本文准主要介绍计算机这门学科的理论发展史,从计算机理论模型的设想开始到通用计算机的实现,以及关于下一代计算机的思考。笔者一直认为不管是学习什么学科,其发展史都是非常有必要的,只有了解了这个学科从零开始发展到现在的过程,才能对整体有更深刻的理解。另外本文也不会涉及太多硬件方面迭代发展的描述。
HashMap HashMap 实现了 Map 接口,用于存储键值对,与 Hashtable 不同的是,HashMap 允许 null 元素。
Hashtable Hashtable 实现了 Map 接口,用于存储键值对,禁止 null 元素。
LinkedBlockingDeque LinkedBlockingDeque 是基于链表的双端阻塞队列,线程安全,元素不允许为 null。
ConcurrentLinkedDeque ConcurrentLinkedDeque 是基于链表的无限双端队列,线程安全,不允许 null 元素。
ArrayDeque ArrayDeque 是 Java 集合中双端队列的数组实现,双端队列的链表实现(LinkedList)我们在前几篇文章中讲过了。
CopyOnWriteArrayList 先看看百科上关于 COW 的介绍: 写入时复制(英语:Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的(transparently)。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源。 简单来说,就是读取时直接读取不用加锁同步,写入数据时会复制一份副本,然后将新的数据写入到副本中,然后再把副本替换成原来的数据。
List 先看下 ArrayList 实现的接口 List 的相关概念。 List 可以称为有序集合或者序列,通过整数索引访问元素 允许插入相同元素 一般来说也允许插入 null 值 List 接口中还提供了一个特殊的迭代器:ListIterator
LinkedList 实现了 List 以及 Deque 的双向链表,元素允许为 null,所以 LinkedList 同时具备 List 以及 Deque 的特性。 跟 ArrayList 一样,LinkedList 也是非线程安全的,可以使用包装方法获取同步对象: List list = Collections.synchronizedList(new LinkedList(...)); iterator以及listIterator同样也被设计为 fail-fast。 使用特性 LinkedList 内部实现上是个链表,所以可以把它当作链表使用。
好久没写博客了,最近比较忙,在系统学习一些知识,没学完之前不太容易输出高质量文章,等过段时间学完了再整理一下写几篇文章出来。
基本概念 APT 全称为 Annotation Processing Tool,可翻译为注解处理器,APT 工具是用于注解处理的命令行程序,它可以找到源码中对应注解的对象并使用注解处理器对其进行处理。 一般来说,我们会使用 APT 生成一些源码,然后加入编译目录进行编译,从而简化开发周期。
关于 Gradle 中的基础、Task 等知识,可以看我的上一篇文章。
Gradle 是用于构建项目的工具,除了管理依赖库之外,Gradle 还支持我们自己添加编译脚本、添加编译配置等控制项目的构建,通过提供 API 我们可以控制编译的每一步操作。
流程分析 我们从一个简单的 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 { } });
我们在自定义 View 控件时随处可见 Matrix 的身影,主要用于坐标转换映射,我们可以通过 Matrix 矩阵来控制视图的变换。
多指触控是指监听多个手指的触控事件,我们可以重写 View 中的 onTouchEvent 方法,或者使用 setOnTouchListener 方法来处理触摸事件。
缓存模块
项目编译 项目基于最新版 Glide 4.9.0 源码分析,通过如下方式获取并编译代码: git clone https://github.com/bumptech/glide.git cd glide ./gradlew jar
QRCodeView 基于 com.google.zxing 开发,用于简化 Android 设备扫描、生成二维码等操作。
Handler Handler 主要用于在不同的线程中相互通信,使用场景最多的应该就是在子线程中更新 UI。 与 Handler 相关的类: Handler:处理与发送消息(Message) Message:消息的包装类 Looper:整个 Handler 通信的核心,接受 Handler 发送的 Message,循环遍历 MessageQueue 中的 Message,并发送至 Handler 处理 MessageQueue:保存 Message LocalThread:存储 Looper 与 Looper所在线程的信息