- 收录文章
- 14 篇文字被发现
- 文章访问
- 0 次从这里出发阅读
- 博客访问
- 0 次前往作者站点
- 最近更新
- 04.12 2023年
FROM THIS BLOG
最近文章
从源码解析一个 SparseArray 线程不安全的崩溃
前言 工作中遇到一个崩溃,将无关逻辑去掉,最后的崩溃部分是: 1if (sparseArray.get(1) != null) { 2 Log.i("SparseArray", sparseArray.get(1).toString()); 3} 抛出的异常是空指针:java.la...
自建NAS方案选型-基建篇
前言 上一篇讲了在 2022 年底到 2023 年初一台性能还不错并且兼顾了兼容性的 NAS 硬件选型思路,算下来价格并不便宜,但是从兼容性和零件可替换性上还是不错的。本篇更多的是关心整体系统基建而非应用层软...
自建NAS方案选型-硬件篇
前言 之前使用的是多年前很火的威联通 453Bmini,2000 块钱 4 盘位的成品 NAS,性价比很高,开箱即用。虽然很多人认为可用性不如群晖,但是我个人的使用不喜欢依赖某一个品牌的生态,大多是开源组装的,所...
子线程更新 UI 全解
子线程更新 UI 异常设计理念及简单源码解析 初学者可能会犯在子线程更新 UI 的错误,例如: 1thread { imageView.setBackgroundColor(Color.RED) } 一旦运行,应用会直接崩溃并抛出异常,这也是我们 Andro...
使用阿里云效同步 Git 仓库到 Github
前言 有时 Github 网络的不稳定性实在令人头痛,push 总是失败,而且需要把主仓库放在 Github 而非 Gitee 等国内平台,虽然可以通过配置代理进行,不过也可以曲线救国,选择通过 push 到国内代码管理平台...
深入源码排查 FLAG_ACTIVITY_NEW_TASK 导致的 Activity 无法正常启动
引言 众所周知 Android 中 Activity 有四种启动模式,决定了是否创建新的 Activity 实例或复用当前实例。但是实际上 Activity 的启动十分复杂,不单单是 android:launchMode 就能决定的,多个 Intent Flag...
遵循 Google 应用指南的 Retrofit + Coroutine 封装
前言 Retrofit 从 2.6.0 以后对 Kotlin 协程提供了原生支持,使得异步请求从写法上更像同步调用,配合 Google 出的 Jetpack 全家桶可以使得网络请求更加优雅简单,而且可以完全遵循 Google 给出的应用架构...
时间格式化的趣事:YYYY 示年
引言 2019 年 12 月 29 到 31 日在格式化时间时出现了一个有趣的小 bug:比如 2019 年 12 月 31 日时间戳有可能会被格式化成:2020-12-31。
MD5 计算前导 0 丢失问题
现象 我们使用 Java 生成 MD5 时常用的写法如下: 1private static String md5(String data) throws NoSuchAlgorithmException { 2 MessageDigest md = MessageDigest.getInstance("MD5"); 3 md.u...
从阿里规约谈起 - 包装类的值比较注意事项
前言 int、long 等基本数据类型值比较可以直接使用 == 比较,其包装类型:Integer、Long 如果直接使用 == 比较大小我们会发现一个神奇的现象。当然,阿里规约也对此做出强制规定: 【强制】 所有的相同类...
有趣的算法 - 布隆过滤器
引言 现在假设一个需求:设计一个 url 黑名单系统,需求是 1 亿个 url 黑名单,每个 url 平均长度 30 字节,判断当前的 url 是否在黑名单中。 我们最先想到的可能时 HashSet,如果少量的 url,HashSet 有...
从阿里规约谈起 - Arrays.asList 三坑
前言 将数组转换成 List 是日常开发十分常见的操作,对此 JDK 提供了一个非常好用的工具类: 1List list = Arrays.asList(array); 但是如果操纵 List 的内容的话,阿里规约会给出一个提示:...