-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
25 lines (25 loc) · 10.3 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!doctype html><html class="scroll-pt-16 scroll-smooth" lang=zh><head><meta name=generator content="Hugo 0.127.0"><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1"><link rel=icon href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'> <text x='0' y='14'>🧑💻</text> </svg>"><link rel=stylesheet href=https://blog.io01.xyz/css/style.css><script type=text/javascript src=https://blog.io01.xyz/js/main.js></script><title>IO01 Blog</title></head><body><header class="sticky top-0 z-10 bg-white backdrop-filter backdrop-blur-lg bg-opacity-70 border-b border-gray-200"><nav class="max-w-5xl mx-auto px-4"><div class="flex items-center justify-between h-16"><a href=/ class="text-2xl text-gray-900 font-semibold">IO01 Blog</a><ul class="flex space-x-4 text-gray-900"><li><a href=https://blog.io01.xyz/posts>归档</a></li><li><a href=https://blog.io01.xyz/about>关于</a></li></ul></div></nav></header><div id=content><main class="flex flex-col justify-center"><div class="flex flex-col mx-auto w-5/6 lg:w-3/4 xl:w-3/5 my-4"><h2 class="text-2xl font-semibold hover:underline hover:underline-offset-4 hover:decoration-2"><a href=https://blog.io01.xyz/posts/2e2d/>从源码解析一个 SparseArray 线程不安全的崩溃</a></h2><div class="inline-flex my-1"><div class="inline-flex items-center"><svg viewBox="0 0 1 1" class="h-4 mr-1"><use href="#calendar"/></svg>
<span class=text-gray-500>2023-04-12</span></div><div class="inline-flex items-center ml-2"><svg viewBox="0 0 1 1" class="h-4 mx-1"><use href="#tags"/></svg>
<a href=https://blog.io01.xyz/tags/android/ class="text-gray-500 mr-1">Android
</a><a href=https://blog.io01.xyz/tags/%E6%BA%90%E7%A0%81/ class="text-gray-500 mr-1">源码</a></div></div><div class="summary-item prose max-w-none"><h2 id=前言>前言</h2><p>工作中遇到一个崩溃,将无关逻辑去掉,最后的崩溃部分是:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f">1</span><span><span style=color:#ff79c6>if</span> (sparseArray.<span style=color:#50fa7b>get</span>(1) <span style=color:#ff79c6>!=</span> <span style=color:#ff79c6>null</span>) {
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f">2</span><span> Log.<span style=color:#50fa7b>i</span>(<span style=color:#f1fa8c>"SparseArray"</span>, sparseArray.<span style=color:#50fa7b>get</span>(1).<span style=color:#50fa7b>toString</span>());
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f">3</span><span>}
</span></span></code></pre></div><p>抛出的异常是空指针:<code>java.lang.NullPointerException</code>,其实根据经验也知道是线程安全问题,但是排查的过程中却越来越觉得我们的应用场景中不应该出现 null 的存在。</p></div><div class="bg-gray-200 w-full h-px mt-3"></div></div><div class="flex flex-col mx-auto w-5/6 lg:w-3/4 xl:w-3/5 my-4"><h2 class="text-2xl font-semibold hover:underline hover:underline-offset-4 hover:decoration-2"><a href=https://blog.io01.xyz/posts/6op1/>自建NAS方案选型-基建篇</a></h2><div class="inline-flex my-1"><div class="inline-flex items-center"><svg viewBox="0 0 1 1" class="h-4 mr-1"><use href="#calendar"/></svg>
<span class=text-gray-500>2023-01-15</span></div><div class="inline-flex items-center ml-2"><svg viewBox="0 0 1 1" class="h-4 mx-1"><use href="#tags"/></svg>
<a href=https://blog.io01.xyz/tags/homelab/ class="text-gray-500 mr-1">HomeLab</a></div></div><div class="summary-item prose max-w-none"><h2 id=前言>前言</h2><p>上一篇讲了在 2022 年底到 2023 年初一台性能还不错并且兼顾了兼容性的 NAS 硬件选型思路,算下来价格并不便宜,但是从兼容性和零件可替换性上还是不错的。本篇更多的是关心整体系统基建而非应用层软件。<strong>如果对 Linux 不够熟悉,直接无脑 Windows Server 什么都不用折腾。</strong></p></div><div class="bg-gray-200 w-full h-px mt-3"></div></div><div class="flex flex-col mx-auto w-5/6 lg:w-3/4 xl:w-3/5 my-4"><h2 class="text-2xl font-semibold hover:underline hover:underline-offset-4 hover:decoration-2"><a href=https://blog.io01.xyz/posts/0j3l/>自建NAS方案选型-硬件篇</a></h2><div class="inline-flex my-1"><div class="inline-flex items-center"><svg viewBox="0 0 1 1" class="h-4 mr-1"><use href="#calendar"/></svg>
<span class=text-gray-500>2023-01-13</span></div><div class="inline-flex items-center ml-2"><svg viewBox="0 0 1 1" class="h-4 mx-1"><use href="#tags"/></svg>
<a href=https://blog.io01.xyz/tags/homelab/ class="text-gray-500 mr-1">HomeLab</a></div></div><div class="summary-item prose max-w-none"><h2 id=前言>前言</h2><p>之前使用的是多年前很火的威联通 453Bmini,2000 块钱 4 盘位的成品 NAS,性价比很高,开箱即用。虽然很多人认为可用性不如群晖,但是我个人的使用不喜欢依赖某一个品牌的生态,大多是开源组装的,所以对我来说威联通和群晖没什么本质区别。慢慢的用途越来越多,这款 NAS 选用的 J3455 性能低下和硬盘无法休眠实在太吵成了我的困扰,特别在理清了我本身不需要任何成品 NAS 生态的需求后,自己组装一台 NAS 成了唯一选择。</p></div><div class="bg-gray-200 w-full h-px mt-3"></div></div><div class="flex flex-col mx-auto w-5/6 lg:w-3/4 xl:w-3/5 my-4"><h2 class="text-2xl font-semibold hover:underline hover:underline-offset-4 hover:decoration-2"><a href=https://blog.io01.xyz/posts/9qg5/>子线程更新 UI 全解</a></h2><div class="inline-flex my-1"><div class="inline-flex items-center"><svg viewBox="0 0 1 1" class="h-4 mr-1"><use href="#calendar"/></svg>
<span class=text-gray-500>2022-01-06</span></div><div class="inline-flex items-center ml-2"><svg viewBox="0 0 1 1" class="h-4 mx-1"><use href="#tags"/></svg>
<a href=https://blog.io01.xyz/tags/android/ class="text-gray-500 mr-1">Android
</a><a href=https://blog.io01.xyz/tags/%E6%BA%90%E7%A0%81/ class="text-gray-500 mr-1">源码</a></div></div><div class="summary-item prose max-w-none"><h2 id=子线程更新-ui-异常设计理念及简单源码解析>子线程更新 UI 异常设计理念及简单源码解析</h2><p>初学者可能会犯在子线程更新 UI 的错误,例如:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-kotlin data-lang=kotlin><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f">1</span><span>thread { imageView.setBackgroundColor(<span style=color:#50fa7b>Color</span>.RED) }
</span></span></code></pre></div><p>一旦运行,应用会直接崩溃并抛出异常,这也是我们 Android 开发的一条铁律:<em>在子线程中不能更新 UI</em>。</p><p>那么为什么 Android 不让子线程更新 UI 呢?原因在于现在屏幕刷新率最低是 60Hz,意味着最多每 16ms 就会刷新一次屏幕,所以 UI 更新要尽可能快速,否则会丢帧导致卡顿。那么 UI 更新操作就不能加锁,频繁的加锁释放锁可能会延长 UI 渲染时间,但是不加锁如果允许子线程更新 UI 会导致多个线程对 UI 同时更新,造成线程不安全而导致 UI 最终效果无法想象,所以 Android 直接限制了子线程更新 UI,实际上不只是 Android 有这种限制,常见的 UI 框架基本都是单线程模型。</p></div><div class="bg-gray-200 w-full h-px mt-3"></div></div><div class="flex flex-col mx-auto w-5/6 lg:w-3/4 xl:w-3/5 my-4"><h2 class="text-2xl font-semibold hover:underline hover:underline-offset-4 hover:decoration-2"><a href=https://blog.io01.xyz/posts/hq29/>使用阿里云效同步 Git 仓库到 Github</a></h2><div class="inline-flex my-1"><div class="inline-flex items-center"><svg viewBox="0 0 1 1" class="h-4 mr-1"><use href="#calendar"/></svg>
<span class=text-gray-500>2021-11-29</span></div><div class="inline-flex items-center ml-2"><svg viewBox="0 0 1 1" class="h-4 mx-1"><use href="#tags"/></svg>
<a href=https://blog.io01.xyz/tags/%E6%9D%82%E9%A1%B9/ class="text-gray-500 mr-1">杂项</a></div></div><div class="summary-item prose max-w-none"><h2 id=前言>前言</h2><p>有时 Github 网络的不稳定性实在令人头痛,push 总是失败,而且需要把主仓库放在 Github 而非 Gitee 等国内平台,虽然可以通过配置代理进行,不过也可以曲线救国,选择通过 push 到国内代码管理平台,然后通过 CI 平台自动推送到 Github。</p><p>阿里云效综合了代码仓库和 CI 平台,私有代码仓库免费,免费构建时间足够支撑我们这点小事,并且执行环境可以选香港保证了能 push 到 GitHub,所以选择了阿里云效。</p><p>理论上所有能通过 <code>git push</code> 触发 CI(CI 的基本操作了)并且基础环境存在 <code>git</code> 而且网络良好的平台都可以按照本文方法进行,甚至有更简单的比如 Gitlab 直接支持推送到 Github,至于本文为何没有选用 Gitlab,纯属个人偏好。</p></div><div class="bg-gray-200 w-full h-px mt-3"></div></div><div class="my-2 flex w-screen justify-center"><span class="mx-3 sm:mx-4 font-semibold text-sky-400 underline underline-offset-4 decoration-2">1
</span><a href=/page/2/ class="mx-3 sm:mx-4 font-semibold text-gray-400 hover:text-sky-400 hover:underline hover:underline-offset-4 hover:decoration-2">2
</a><a href=/page/3/ class="mx-3 sm:mx-4 font-semibold text-gray-400 hover:text-sky-400 hover:underline hover:underline-offset-4 hover:decoration-2">3</a></div></main></div><footer><div class="flex justify-center mt-6 mb-2 text-gray-500"><span>©2024
<span class=ml-2><a class=hover:text-sky-400 href=https://blog.io01.xyz>IO01</a>
</span></span><span class=mx-2>|</span>
<span>Powered by
<a class=hover:text-sky-400 href=https://gohugo.io>Hugo</a>
</span><span class=mx-1>&</span>
<span><a class=hover:text-sky-400 href=#>FullMoon</a></span></div></footer></body></html>