<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[一个有思想的搬运工]]></title><description><![CDATA[我浑浑噩噩，却又不甘落寞]]></description><link>https://blog.youkuaiyun.com/OneDeveloper</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; OneDeveloper]]></copyright><item><title><![CDATA[OpenGL 学习记录]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/126908644</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/126908644</guid><author>OneDeveloper</author><pubDate>Sat, 17 Sep 2022 17:54:29 +0800</pubDate><description><![CDATA[关于 OpenGL 的学习记录]]></description><category></category></item><item><title><![CDATA[Kotlin Flow 相关笔记]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/122422324</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/122422324</guid><author>OneDeveloper</author><pubDate>Tue, 11 Jan 2022 00:35:08 +0800</pubDate><description><![CDATA[参考文章：https://developer.android.com/kotlin/flow?hl=zh-cn
涉及到的源码版本（不同版本实现可能有出入）：


flow() 方法
以下内容，都是基于 flow() 顶级方法的内部实现是基于 SafeCollector 和 SafeFlow 来说明的。
实现原理
public fun &lt;T&gt; flow(@BuilderInference block: suspend FlowCollector&lt;T&gt;.() -&gt; Unit): F]]></description><category></category></item><item><title><![CDATA[About “Zero Copy“]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/122360424</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/122360424</guid><author>OneDeveloper</author><pubDate>Fri, 07 Jan 2022 11:14:21 +0800</pubDate><description><![CDATA[Understanding of Netty ByteBuf’s Zero Copy (Zero Copy)

]]></description><category></category></item><item><title><![CDATA[DialogFragment 与 android.view.WindowManager$BadTokenException]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/119542229</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/119542229</guid><author>OneDeveloper</author><pubDate>Mon, 09 Aug 2021 17:37:03 +0800</pubDate><description><![CDATA[在项目中，有一个场景是某个 Activity 中会触发一个 BottomSheetDialogFragment，并在某些情况下会常驻显示不消失。
然后就在线上遇到了一类 crash：
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@c7a2c02 is not valid; is your activity running?
at android.view.V]]></description><category></category></item><item><title><![CDATA[自定义 View 实现扫描效果]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/115430673</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/115430673</guid><author>OneDeveloper</author><pubDate>Sun, 04 Apr 2021 17:41:40 +0800</pubDate><description><![CDATA[演示效果如下：

实现内容：

控制动画是竖向或者横向
控制动画初始是从底部/左边开始，或者从上边/右边开始
控制动画的时常
可以自定义动画素材

具体实现：
自定义属性：
&lt;declare-styleable name="ScanView" tools:ignore="ResourceName"&gt;
    &lt;!--扫描的图片--&gt;
    &lt;attr name="unit_scan_img" format="reference" /&gt;
    &lt;!--动画时长--]]></description><category></category></item><item><title><![CDATA[ViewModel 在 Activity 中的实现原理]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/115049760</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/115049760</guid><author>OneDeveloper</author><pubDate>Sun, 21 Mar 2021 16:39:23 +0800</pubDate><description><![CDATA[系统源码参考自 Android API 30 Platform，以及 androidx.lifecycle:lifecycle-viewmodel:2.2.0

在文章开始之前，有如下几点疑惑，先记录下来：

ViewModel#onCleared() 的调用时机 ？
ViewModel 与 onSaveInstanceState() 有联系吗？或者有什么区别吗？
ViewModel 是否涉及序列化与反序列化？
一个 Activity 中是否支持多个 ViewModel ？


1. 与 ViewModel]]></description><category></category></item><item><title><![CDATA[ViewModel 简析]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/115049221</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/115049221</guid><author>OneDeveloper</author><pubDate>Sun, 21 Mar 2021 15:13:44 +0800</pubDate><description><![CDATA[1. 前述
ViewModel 的作用是专门存放与界面相关的数据，分担 Activity/Fragment 的逻辑，同时会维护自己独立的生命周期。如当系统配置发生变更（如切换语言等）、横竖屏切换等，可能会导致 Activity 销毁重建，假设要被销毁是 Activity A，需要被重新创建的是 Activity B，虽然他们都属于同一类型，但是是两个不同的实例对象。因此在 Activity 销毁重建的过程中，就涉及 A 在销毁时，其内部维护的数据要过渡到重建的 B 中，这就依赖于 ViewModel。

V]]></description><category></category></item><item><title><![CDATA[Java 的 Class#isInstance() 与 instanceof]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/114991309</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/114991309</guid><author>OneDeveloper</author><pubDate>Thu, 18 Mar 2021 21:31:08 +0800</pubDate><description><![CDATA[在 Java 中，有两种方式来判断某个对象是否是某一类型：

Class#isInstance()
instanceof

两者在作用是等价的，只不过 instanceof 是 Java 的关键字，isInstance() 是 Class 的成员方法。
但是在用法上，Class#isInstance() 会更加灵活一点，因为使用  instanceof 时，必须要知道具体的目标类型：
obj instanceof ExactClass

而 Class#isInstance() 则不必，比如：
boolea]]></description><category></category></item><item><title><![CDATA[如何在日常工作之外给出自己的时间]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/114859093</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/114859093</guid><author>OneDeveloper</author><pubDate>Tue, 16 Mar 2021 00:26:36 +0800</pubDate><description><![CDATA[回想起 20 年的八九月，被一个又一个的需求按在地上摩擦，连续好几周，每天基本上都埋在需求实现里面，两点一线，写了睡，睡了写，那时候就感觉自己是一个代码机器，没有任何时间思考，连喘口气的片段都是奢望。甚至有一次，一种强烈的呕吐感袭来，差点交代在了厕所，现在回想起来都后怕。
虽然那段时间过后，好了一点，自己也克制了一点，但是还是感觉浑浑噩噩的，一直持续到这个月月初。但是从这个月月初开始，算是正式的醒悟了吧。
因为我意识到，如果一心扑在所谓的需求上，不给自己留有时间与空间，来做自己的事，来让自己停下来思考，不管]]></description><category></category></item><item><title><![CDATA[折中方案实现 SimpleDraweeView 圆形头像]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/114283969</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/114283969</guid><author>OneDeveloper</author><pubDate>Tue, 02 Mar 2021 14:29:13 +0800</pubDate><description><![CDATA[在使用 Fesco SimpleDraweeView 的时候，有一个需求是要在页面上展示圆形的头像，如果通过 roundAsCircle 属性来实现，可能在某些机型上出现适配的问题，如在华为 Mate P30 上，在系统设置更改字体大小，导致页面重新绘制的时候，会导致圆形头像偏移，或者发生的拉升出现十字的问题，如下图：


此时虽然有另外一种实现，即使用 roundWithOverlayColor 属性，但是使用场景有局限性，即 roundWithOverlayColor 对应的颜色 C1，要与下层的 vi]]></description><category></category></item><item><title><![CDATA[关于 Java、Kotlin 范型与协变、逆变学习笔记]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/114107402</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/114107402</guid><author>OneDeveloper</author><pubDate>Thu, 25 Feb 2021 22:02:10 +0800</pubDate><description><![CDATA[学习文章：https://rengwuxian.com/169.html
笔记

先定义三个类，用于辅助说明，其继承关系如下：
class Grandfather {}

class Father extends Grandfather {}

class Son extends Father {}

关于「协变」，即指的是子类的范型类型（比如 Son 是 Father 的子类，拿着子类 Son 去声明范型类型 ArrayList&lt;Son&gt; ），也属于范型类型的子类（即 ArrayList&lt]]></description><category></category></item><item><title><![CDATA[Android ConstraintLayout 设置子 view maxWidth 是父 ConstraintLayout width 的百分比]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/106864180</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/106864180</guid><author>OneDeveloper</author><pubDate>Fri, 19 Jun 2020 21:48:49 +0800</pubDate><description><![CDATA[话不多说，直接上代码：
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://sc]]></description><category></category></item><item><title><![CDATA[Android 编写一个简单的 gradle 插件]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/106798222</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/106798222</guid><author>OneDeveloper</author><pubDate>Tue, 16 Jun 2020 23:57:26 +0800</pubDate><description><![CDATA[如何从零开发一个 gradle 插件（一）

]]></description><category></category></item><item><title><![CDATA[Android 主动 try-catch 主线程的 Exception]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/106364630</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/106364630</guid><author>OneDeveloper</author><pubDate>Tue, 26 May 2020 20:57:01 +0800</pubDate><description><![CDATA[android.os.Handler(android.os.Looper.getMainLooper()).post(object : Runnable {
    override fun run() {
        while (true) {
            try {
                android.os.Looper.loop()
            } catch (e: Throwable) {
                android.util.Log.]]></description><category></category></item><item><title><![CDATA[关于 Kotlin 的 ::]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/105470944</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/105470944</guid><author>OneDeveloper</author><pubDate>Mon, 13 Apr 2020 11:01:43 +0800</pubDate><description><![CDATA[学习视频：https://mp.weixin.qq.com/s/SkXgevDiQF9T4kyoL4_qVg
对于 Kotlin，存在一个 「函数类型」的概念，即表示某个变量类型是一个函数类型，但是要注意，函数类型并不是一个通用类型，而一个指代的名词。
(a: Int)-&gt;Unit

(a: Int)-&gt;String

上面即对应着两种函数类型，第一个是 (a: Int)-&gt;Un...]]></description><category></category></item><item><title><![CDATA[【转】Java线程池实现原理及其在美团业务中的实践]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/105391289</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/105391289</guid><author>OneDeveloper</author><pubDate>Wed, 08 Apr 2020 16:42:50 +0800</pubDate><description><![CDATA[传送门：https://mp.weixin.qq.com/s/baYuX8aCwQ9PP6k7TDl2Ww

]]></description><category></category></item><item><title><![CDATA[模拟 App 在后台时，因为系统资源不足被 kill 的场景]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/105286587</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/105286587</guid><author>OneDeveloper</author><pubDate>Fri, 03 Apr 2020 10:17:40 +0800</pubDate><description><![CDATA[传送门：Defending Your In-Background App When Android OS Kills It

]]></description><category></category></item><item><title><![CDATA[CI、CD、Pipeline 概念]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/105029118</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/105029118</guid><author>OneDeveloper</author><pubDate>Sun, 22 Mar 2020 16:34:34 +0800</pubDate><description><![CDATA[文章：什么是持续集成（CI）/持续部署（CD）？
简要摘抄：
对于 “持续” 一词的概念

这并不意味着“一直在运行”，而是“随时可运行”。

CI 即持续集成

持续集成（continuous integration）是在源代码变更后自动检测、拉取、构建和（在大多数情况下）进行单元测试的过程。
目标是快速确保开发人员新提交的变更是好的，并且适合在代码库中进一步使用。

CD 可分别指代两个概念：...]]></description><category></category></item><item><title><![CDATA[Android 手机存储相关内容]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/104715693</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/104715693</guid><author>OneDeveloper</author><pubDate>Sat, 07 Mar 2020 15:54:38 +0800</pubDate><description><![CDATA[应用操作的文件存储位置分为三个部分：
1、应用内部存储私有文件目录
2、应用外部存储私有文件目录
3、公有目录

Android手机存储分为两个部分：内部存储和外部存储，内部存储一般是手机自带的存储空间，外部存储指外插SD卡提供的存储空间；随着手机发展，这两个存储的定义又有了一些些变化，新的手机不再有外插SD卡的概念，采取了内置闪存（eMMC、UFS等）的方式，所以内部存储和外部存储在新的And...]]></description><category></category></item><item><title><![CDATA[关于代码编写时「抽象」概念的一点点心得]]></title><link>https://blog.youkuaiyun.com/OneDeveloper/article/details/104705844</link><guid>https://blog.youkuaiyun.com/OneDeveloper/article/details/104705844</guid><author>OneDeveloper</author><pubDate>Fri, 06 Mar 2020 23:18:28 +0800</pubDate><description><![CDATA[关于抽象，是面向对象的特性，之前实际写代码的时候，可能注意得不是很好，对于这个点的理解也不是很到位。
但是因为公司项目涉及到了组件化，不同组件之间的通信其实是依赖抽象接口来规范的，或者说是约束的。
而一开始，我在定义抽象接口的时候，就处理得不是很好，偶尔会把具体业务层的实现带到接口定义之中，虽然觉得这样有点不对劲，但是却无法参透。
后来，在 code review 的时候，我的导师针对我的问题跟我...]]></description><category></category></item></channel></rss>