<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[御风而行]]></title><description><![CDATA[记录点点滴滴]]></description><link>https://blog.youkuaiyun.com/future234</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; future234]]></copyright><item><title><![CDATA[Android如何优雅地解决重复Drawable资源]]></title><link>https://blog.youkuaiyun.com/future234/article/details/123126620</link><guid>https://blog.youkuaiyun.com/future234/article/details/123126620</guid><author>future234</author><pubDate>Fri, 25 Feb 2022 10:01:44 +0800</pubDate><description><![CDATA[1. 前言

最近鸿洋大神和路遥大佬分别在他们的公众号上发布了关于解决Shape/Selector冗余的方案。这篇文章在上周末就已经写好了。虽然类似的解决方案特别多，实现思路也都差不多。但我仍然要安利一下我的这个解决方案。原因有以下几点。


很纯粹，就是用代码的方式实现了xml实现的Drawable，不用重写自定义View或者Hook系统的基础组件。


最大程度的复刻xml所拥有的能力，甚至连单位dp还是px的api都提供好了。


使用Builder模式将方法和参数都约束起来，使用起来很方便，不用去众]]></description><category></category></item><item><title><![CDATA[抽丝剥茧聊协程之深入理解Continuation原理]]></title><link>https://blog.youkuaiyun.com/future234/article/details/122931588</link><guid>https://blog.youkuaiyun.com/future234/article/details/122931588</guid><author>future234</author><pubDate>Mon, 14 Feb 2022 20:33:13 +0800</pubDate><description><![CDATA[1. 前言
这是新年以来的第一篇更文，在此给大家拜个晚年，祝大家在新的一年所想的都能如愿，同时感谢大家一直以来的支持和帮助。这篇文章其实在春节前就已经构思完了，本想着在留京过年期间写完，由于计划变更，回老家过年去了，春节期间大部分时间在走亲戚，文章也就搁置下来了。
闲话少叙，本文我将尝试给大家讲明白，Kotlin协程如何实现用同步的方式实现异步调用。相信不少同学都能说出以下几种概念中的一个或者多个。

Kotlin suspend关键字
Kotlin内部的Continuation机制
Continuatio]]></description><category></category></item><item><title><![CDATA[抽丝剥茧聊Kotlin协程之协程异常处理机制]]></title><link>https://blog.youkuaiyun.com/future234/article/details/122317392</link><guid>https://blog.youkuaiyun.com/future234/article/details/122317392</guid><author>future234</author><pubDate>Wed, 05 Jan 2022 10:09:04 +0800</pubDate><description><![CDATA[1. 前言
如果你是第一次听说有人把异常处理和事件分发联系在一起，相信你会跟我第一次接触协程异常处理机制时一样，一脸懵逼。别说在座的各位有不少Android老司机，就算是Android萌新，也应该知道，异常处理不就是try catch这么简单的事么，怎么能和复杂的事件分发机制扯上关系？别不信还真扯的上关系。
如果你已经接触协程知识有段时间，并且知道协程的异常处理机制和我们以往了解的异常处理机制不一样，但是又没能完全它的原理，我会一步一步带你搞清楚这是怎么回事。
如果你对协程异常处理机制了然于胸，那么恭喜你，]]></description><category></category></item><item><title><![CDATA[深入理解Kotlin协程suspend工作原理(初学者也能看得懂)]]></title><link>https://blog.youkuaiyun.com/future234/article/details/122248766</link><guid>https://blog.youkuaiyun.com/future234/article/details/122248766</guid><author>future234</author><pubDate>Fri, 31 Dec 2021 07:14:43 +0800</pubDate><description><![CDATA[1. 概述
挂起函数是Kotlin协程最重要的一个特性，所有其他概念都建立在它的基础上。所以我们需要深入了解它的工作原理。
挂起协程意味着在中间停止它。这类似于玩游戏，当我们想暂停游戏时，可以先存档，想继续游戏时，可以从存档处恢复游戏。当协程被暂停时，它会返回一个Continuation. 这就像游戏中的存档，协程可以使用Continuation从挂起的地方恢复。
请注意，这与线程非常不同，线程无法保存，只能阻塞。协程要强大得多，挂起时，它不消耗任何所在线程的资源。协程不一定需要在启动协程的线程上恢复，可以]]></description><category></category></item><item><title><![CDATA[抽丝剥茧聊Kotlin协程之协程是如何建立结构化并发的]]></title><link>https://blog.youkuaiyun.com/future234/article/details/122165487</link><guid>https://blog.youkuaiyun.com/future234/article/details/122165487</guid><author>future234</author><pubDate>Mon, 27 Dec 2021 09:45:18 +0800</pubDate><description><![CDATA[1. 协程的结构化并发
上篇文章，我通过两个例子简单的介绍了Job cancel方法在不同的父子关系情况下，看起来很相似的代码，执行结果却很不相同的情况。文中我引出了Job结构化并发的概念，即父Job和子Job形成树的数据结构，本文我将详细介绍Kotlin协程框架是如何实现结构化并发的。
什么叫结构化并发？用通俗易懂的话解释就是，协程之间的协作是有组织，有纪律的。如果协程之间的关系是确定了的，那么协程之间的cancel和exception处理是有章法可寻的。
下图，假设Job2处发生了异常，那么它的子Job]]></description><category></category></item><item><title><![CDATA[抽丝剥茧聊Kotlin协程之聊聊Job和SupervisorJob的区别]]></title><link>https://blog.youkuaiyun.com/future234/article/details/122165472</link><guid>https://blog.youkuaiyun.com/future234/article/details/122165472</guid><author>future234</author><pubDate>Mon, 27 Dec 2021 09:44:19 +0800</pubDate><description><![CDATA[1. 前言
随着协程的普及，协程知识越来越被面试官青睐。首先，协程的面试题一般都很简洁，一两句简单的话就能把问题描述清楚，其次于面试官而言，协程框架中精妙的数据结构与算法可以很好的考察应聘者对基础知识的掌握程度。相对于烂大街的Android八股文，它又能很好的考察应聘者的主动学习能力。所谓行家一伸手便知有没有。协程知识便是面试场景中的行家和试金石。闲话少叙，本文带大家聊聊Job和SupervisorJob的区别。
2. Job和SupervisorJob的区别
如果你看过协程的官方文档或视频。你应该会知道J]]></description><category></category></item><item><title><![CDATA[抽丝剥茧聊Kotlin协程之Job初体验]]></title><link>https://blog.youkuaiyun.com/future234/article/details/121995129</link><guid>https://blog.youkuaiyun.com/future234/article/details/121995129</guid><author>future234</author><pubDate>Fri, 17 Dec 2021 14:09:55 +0800</pubDate><description><![CDATA[1.前言
如果要我拿现实中的一事物与Kotlin协程中的Job做一个类比，那么我会把Job比作成海洋中的冰山。自由漂浮的冰山约有90%体积沉在海水表面下，因此看着浮在水面上的形状并猜不出水下的形状。与冰山一样，Job提供给开发者的功能非常简单，但是在协程框架内部Job却做了大量的工作。至关重要的是，如果开发者不去深入了解Job内部的实现机制，那么在使用协程的过程中，他就犹如开着船与冰山擦肩而过的船长，随时有可能面临系统崩溃的风险。如果你的项目中正在使用协程，如果你想享受协程编程带来的便利的同时又想保证程序.]]></description><category></category></item><item><title><![CDATA[抽丝剥茧聊Kotlin协程之深入理解协程上下文CoroutineContext]]></title><link>https://blog.youkuaiyun.com/future234/article/details/121690474</link><guid>https://blog.youkuaiyun.com/future234/article/details/121690474</guid><author>future234</author><pubDate>Fri, 03 Dec 2021 07:34:59 +0800</pubDate><description><![CDATA[1. 前言

如果你对CoroutineContext不了解，本文值得你细细品读，如果一遍看不懂，不妨多读几遍。写作该文的过程也是我对CoroutineContext理解加深的过程。CoroutineContext是协程的基础，值得投入学习

Android开发者对Context都不陌生。在Android系统中，Context可谓神通广大，它可以获取应用资源，可以获取系统资源，可以启动Activity。Context有几个大名鼎鼎的子类，Activity、Application、Service，它们都是应用]]></description><category></category></item><item><title><![CDATA[抽丝剥茧聊Kotlin协程之协程是如何启动起来的？]]></title><link>https://blog.youkuaiyun.com/future234/article/details/121690469</link><guid>https://blog.youkuaiyun.com/future234/article/details/121690469</guid><author>future234</author><pubDate>Fri, 03 Dec 2021 07:33:03 +0800</pubDate><description><![CDATA[1. 前言
本文主要介绍协程的启动原理，如果没有协程实战经验或者没有Debug过协程的源码，看起来可能会有点费劲，但是如果将来有机会学习协程的源码，那么这篇文章可能会对你有一定的帮助。文章主要是讲解协程启动的流程，简便起见，该过程中涉及到的其它比较重要协程知识点可能只会简单提到，本文不会深入去讲解，后续有空会对他们单独成文。
2. 简单的例子
首先 我们来看一个简单的例子，在主线程中开启一个协程，打印“Hello Coroutines”。通过这个简单的例子讲解协程是如何启动起来的。

接着我们将startC]]></description><category></category></item><item><title><![CDATA[抽丝剥茧聊Kotlin协程之协程与线程之间的区别]]></title><link>https://blog.youkuaiyun.com/future234/article/details/121690464</link><guid>https://blog.youkuaiyun.com/future234/article/details/121690464</guid><author>future234</author><pubDate>Fri, 03 Dec 2021 07:31:19 +0800</pubDate><description><![CDATA[1. 前言
关于协程，可能大家最经常听到的一句话就是“协程是轻量级的线程”。一脸懵逼，有没有？这可是官方的slogan，严格意义上讲，一方面官方是想让大家把协程和线程产生一个直观关联，另一方面想宣传协程在性能上比线程更优，充分地说服大家去使用它。本文我将尝试把协程是什么讲明白。
2. 聊聊线程
既然说“协程是轻量级的线程”。那我们有必要先回顾下线程是什么？ 在泛Java程序中，要启动一个线程那太easy了，new一个Thread，重写run方法，调用start方法，就是这么简单。
public fun th]]></description><category></category></item><item><title><![CDATA[ConcatAdapter使用教程]]></title><link>https://blog.youkuaiyun.com/future234/article/details/116860348</link><guid>https://blog.youkuaiyun.com/future234/article/details/116860348</guid><author>future234</author><pubDate>Sat, 15 May 2021 19:31:47 +0800</pubDate><description><![CDATA[1.前言
2021年4月7日Android团队正式发布了RecyclerView 1.2.0版本。相对于1.1.0版本，它有两个主要的变化：

增加了ConcatAdapter：这个Adapter方便地让我们在一个RecyclerView中连接多个Adapters。
支持延迟恢复状态：RecyclerView现在支持当内容加载出来后恢复状态。

本文将结合ConcatAdapter的简单使用，由浅入深地讲解ConcatAdapter的高级使用。
2.简单使用
实现上面是文本列表，下面是按钮列表的效果，如图：]]></description><category></category></item><item><title><![CDATA[找出数组中只出现一次的数字]]></title><link>https://blog.youkuaiyun.com/future234/article/details/115538271</link><guid>https://blog.youkuaiyun.com/future234/article/details/115538271</guid><author>future234</author><pubDate>Fri, 09 Apr 2021 09:54:05 +0800</pubDate><description><![CDATA[1.题目(困难)
给定一个数组，除了一个元素只出现1次，其它元素都出现3次。设计一个算法找出只出现一次的元素。要求时间复杂度为O(n)，额外空间O(1)。
1.1 例子

输入: arr[] = {12, 1, 12, 3, 12, 1, 1, 2, 3,3}
输出: 2
除了2其它都出现3次。
输入: arr[] = {10, 20, 10, 30, 10, 30, 30}
输出: 20
除了20其它都出现3次。

1.2 java代码实现
class GFG {
	static int getSingl]]></description><category></category></item><item><title><![CDATA[干货|详解位图算法在Android RecyclerView中的应用]]></title><link>https://blog.youkuaiyun.com/future234/article/details/115063685</link><guid>https://blog.youkuaiyun.com/future234/article/details/115063685</guid><author>future234</author><pubDate>Mon, 22 Mar 2021 09:36:29 +0800</pubDate><description><![CDATA[1. 前言
1.1 关于算法
金庸武侠小说中的主人公在成为绝世高手之前，都会学习一门玄门内功。郭靖有了全真派的内功才能修炼九阴真经、虚竹得到了无崖子的毕生功力后，武学造诣日渐精进、张无忌苦练五年九阳神功，日后才能融合乾坤大挪移。对于程序员，算法就是小说中的内功，编程语言就是不同门派的武功。张无忌因为有九阳神功加持仅用一天就学会了阳顶天几十年都学不成的乾坤大挪移。一名优秀的程序员需要不断的修炼算法内功，才能取得更高的编程造诣。
1.2 Algorithm&amp;Android系列
“算法在实际编程中应用很少]]></description><category></category></item><item><title><![CDATA[TouchDelegate的这些盲区你知道吗？]]></title><link>https://blog.youkuaiyun.com/future234/article/details/114991477</link><guid>https://blog.youkuaiyun.com/future234/article/details/114991477</guid><author>future234</author><pubDate>Thu, 18 Mar 2021 21:32:15 +0800</pubDate><description><![CDATA[1. 前言
早些时候我发了一篇关于对话框动画的文章全网独一份的对话框弹出样式。用户阅读量，分享量，阅读后关注量等数据比较好。与之前偏重Android源码解析的文章不同，那是一篇更偏实战的文章。美中不足的是，代码注释量很少，有读者反馈阅读体验不佳。如果这个问题也曾困扰过你，借此向您真诚道歉，由于行文仓促，没有投入更多精力，今后在文章润色上投入更多时间，争取为读者带来更好的阅读体验。
如果您觉得我的文章写的还行，欢迎关注"字节小站"微信公众号。更多好文等着你。
2. 关于TouchDelegate
本文内容不仅]]></description><category></category></item><item><title><![CDATA[从点击处弹出的对话框你想要吗？]]></title><link>https://blog.youkuaiyun.com/future234/article/details/114843380</link><guid>https://blog.youkuaiyun.com/future234/article/details/114843380</guid><author>future234</author><pubDate>Mon, 15 Mar 2021 17:56:27 +0800</pubDate><description><![CDATA[最近实现了一个从点击处弹出的对话框，最终效果如下：

1. 接招
实现对话框功能可选择的技术有 Dialog、PopupWindow、Activity。它们都支持自定义弹出和消失动画。它们都能实现自定义动画。





WindowAnimation
Transition
ShareElement Transition




Dialog
支持
不支持
不支持


PopupWindow
支持
支持
不支持


Activity
支持
支持
支持



WindowAnimation动画必须要在style]]></description><category></category></item><item><title><![CDATA[面试官：RecyclerView布局动画原理了解吗？]]></title><link>https://blog.youkuaiyun.com/future234/article/details/113929102</link><guid>https://blog.youkuaiyun.com/future234/article/details/113929102</guid><author>future234</author><pubDate>Mon, 22 Feb 2021 09:37:22 +0800</pubDate><description><![CDATA[前言
温馨提示：文章有点长，建议关注微信公众号“字节小站”收藏阅读
本文主要通过以下几个方面来讲解RecyclerView的布局和动画原理：

布局放置:RecyclerView#dispatchLayout()
预布局阶段：RecyclerView#dispatchLayoutStep1()
布局阶段：RecyclerView#dispatchLayoutStep2()
开启动画阶段：RecyclerView#dispatchLayoutStep3()


背景知识
RecyclerView的Adapte]]></description><category></category></item><item><title><![CDATA[聊聊写作那些事]]></title><link>https://blog.youkuaiyun.com/future234/article/details/113829285</link><guid>https://blog.youkuaiyun.com/future234/article/details/113829285</guid><author>future234</author><pubDate>Tue, 16 Feb 2021 22:29:59 +0800</pubDate><description><![CDATA[我已经连续半年在字节小站公众号发表了13篇原创Android技术文章，经过这段时间的历练，我已经度过了畏首畏尾的新手阶段，变得淡定自若，驾轻就熟。我刚开始萌发写文章的念想时，产生过这些顾虑：我的写作水平并不好，写出来的文章会不会贻笑大方？我没有粉丝，写出来的文章会有人看吗？没有美术功底，怎么能让文章排版好看？如果工作比较忙，没有时间继续写作怎么办？写作的过程中，会碰到一些自己之前根本没有接触过但是一时半会又学不来的技能，该怎么办？这些都是我前进路上的绊脚石，还没开始做，就已经想好了各种困难的情况，这就是所谓]]></description><category></category></item><item><title><![CDATA[ViewCompat.offsetTopAndBottom翻车现场]]></title><link>https://blog.youkuaiyun.com/future234/article/details/113826019</link><guid>https://blog.youkuaiyun.com/future234/article/details/113826019</guid><author>future234</author><pubDate>Tue, 16 Feb 2021 16:46:30 +0800</pubDate><description><![CDATA[引言
去年我开源了一个RecyclerView吸顶库，关于它的介绍请大家移步“我开源了一个RecyclerView吸顶库”一文。别看这个库大量使用了泛型，对象池、链表等技术，但是吸顶的功能真正倚仗的只有ViewCompat.offsetTopAndBottom(View view,int offset)这一个方法。它能够帮我们实现将View上下平移。它的姐妹方法offsetLeftAndRight(View view, int offset)可以实现将View左右平移，一般情况使用它们实现平移效果非常简单，]]></description><category></category></item><item><title><![CDATA[BottomSheetBehavior实现高德地图首页效果之原理篇]]></title><link>https://blog.youkuaiyun.com/future234/article/details/113481095</link><guid>https://blog.youkuaiyun.com/future234/article/details/113481095</guid><author>future234</author><pubDate>Sun, 31 Jan 2021 16:48:46 +0800</pubDate><description><![CDATA[1. 引言
BottomSheetBehavior能实现怎样的效果，一图胜千言。

如果仅仅是实现上下拖动和隐藏的功能。抛开BottomSheetBehavior自己实现也不难，在没有CoordinatorLayout的年代，这种效果往往是纯手工打造。既然如此为何Google要专门设计BottomSheetBehavior呢？为了搞清楚这个问题，我查阅源码探究了一番，确实发现了一些隐秘的角落。我将从以下几个方面讲解BottomSheetBehavior的设计思路

讲解BottomSheetBehavior]]></description><category></category></item><item><title><![CDATA[使用AppBarLayout实现二次吸顶功能]]></title><link>https://blog.youkuaiyun.com/future234/article/details/111308546</link><guid>https://blog.youkuaiyun.com/future234/article/details/111308546</guid><author>future234</author><pubDate>Thu, 17 Dec 2020 09:42:05 +0800</pubDate><description><![CDATA[我开源了一个方便RecyclerView吸顶的Android库,欢迎您访问https://github.com/lizijin/StickyHeaderForRecyclerView，如果您使用本库，请提出您的宝贵意见。

它目前支持以下功能:

支持单类型吸顶功能
支持多类型吸顶功能
支持开启和关闭吸顶功能
支持指定位置吸顶功能
支持设置吸顶偏移量
支持自定义RecyclerView上Item吸顶边界自定义
可以无缝配合AppBarLayout


开门见山，最近需要实现一个二次吸顶的效果，UE给出的效果]]></description><category></category></item></channel></rss>