自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(122)
  • 论坛 (1)
  • 收藏
  • 关注

原创 反思 | 事件总线的局限性,组件化开发流程中通信机制的设计与实现

反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。背景诸如EventBus\RxBus\LiveDataBus的事件总线库在业内正遭滥用。诚然,事件总线看起来 小而美 ,但随着业务复杂度上升,事件的发送和订阅到处分布,这个优势反而成为了负担,因此,笔者不建议在任何量级的项目中使用事件总线库。更多原因读者可参考 这篇文章 。更合理的方案是什么呢?在量级较小的项目中,开发者应该通过 依赖注入 将Callback进行不同层级的依次传递,以保证 层级间的依赖关系足够清晰。而对于.

2021-01-16 20:35:05 586 2

原创 反思|官方也无力回天?Android SharedPreferences的设计与实现

反思|官方也无力回天?Android SharedPreferences的设计与实现反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。起源就在前几日,有幸拜读到 HiDhl 的文章,继腾讯开源类似功能的MMKV之后,Google官方维护的 Jetpack DataStore 组件横空出世——这是否意味着无论是腾讯三方还是Google官方的角度,SharedPreferences都彻底告别了这个时代?无论是MMKV的支持者还是DataStore的拥趸,SharedPrefe

2020-10-17 16:36:37 7351 3

原创 反思|Android 输入系统 & ANR机制的设计与实现

反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。概述对于Android开发者而言,ANR是一个老生常谈的问题,站在面试者的角度,似乎说出 「不要在主线程做耗时操作」 就算合格了。但是,ANR机制到底是什么,其背后的原理究竟如何,为什么要设计出这样的机制?这些问题时时刻刻会萦绕脑海,而想搞清楚这些,就不得不提到Android自身的 输入系统 (Input System)。Android自身的 输入系统 又是什么?一言以蔽之,任何与Android设备的交互——我们称之为 输.

2020-08-24 22:14:25 1757

原创 反思|Android源码模块化管理工具Repo分析

「反思」 系列是笔者对于 学习归纳 一种新的尝试,其起源与目录请参考 这里 。起源随着Android项目 模块化 或 插件化 项目业务的愈发复杂,开发流程中通过版本控制工具(比如Git)管理项目的成本越来越高。以大名鼎鼎的 Android源代码开源项目 (Android Open-Source Project,下文简称 ASOP)为例,截止2020年初,Android10的源码项目,其模...

2020-05-05 16:10:17 974

原创 反思|Android 事件拦截机制的设计与实现

「反思」 系列是笔者一个新的尝试,其起源与目录请参考 这里 。概述完整的掌握 Android 事件分发体系并非易事,其整个流程涉及到了 系统启动流程(SystemServer)、输入管理(InputManager)、系统服务和UI的通信(ViewRootImpl + Window + WindowManagerService)、View层级的 事件分发机制 等等一系列的环节。事件拦截机制...

2020-04-15 23:37:00 1243 1

原创 哈希映射用法及算法例题

本文为博主算法学习过程中的学习笔记,主要内容来源于其他平台或书籍,出处请参考下方 参考&感谢 一节。用法哈希映射 是用于存储 (key, value) 键值对的一种实现。使用哈希映射的第一个场景是,我们 需要更多的信息,而不仅仅是键。然后通过哈希映射 建立密钥与信息之间的映射关系。另一个常见的场景是 按键聚合所有信息。我们也可以使用哈希映射来实现这一目标。例题1、两数之和...

2020-03-09 01:06:01 6275 1

原创 哈希集合用法及算法例题

本文为博主算法学习过程中的学习笔记,主要内容来源于其他平台或书籍,出处请参考下方 参考&感谢 一节。用法哈希集 是集合的实现之一,它是一种存储 不重复值 的数据结构。因此,通常,使用哈希集来检查该值是否已经出现过。让我们来看一个例子:给定一个整数数组,查找数组是否包含任何重复项。这是一个典型的问题,可以通过哈希集来解决。你可以简单地迭代每个值并将值插入集合中。 如果...

2020-03-09 01:05:19 1228

原创 哈希表原理及简单设计

本文为博主算法学习过程中的学习笔记,主要内容来源于其他平台或书籍,出处请参考下方 参考&感谢 一节。介绍哈希表 是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。有两种不同类型的哈希表:哈希集合 和 哈希映射。哈希集合是 集合 数据结构的实现之一,用于存储 非重复值。哈希映射是 映射 数据结构的实现之一,用于存储(key, value)键值对。通过选择合适的...

2020-03-09 01:04:44 892

原创 运用递归解决二叉树相关问题

在之前的章节中,我们已经介绍了如何解决树的遍历问题。我们也已经尝试过使用递归解决树的为 前序遍历 、 中序遍历 和 后序遍历 问题。事实上,递归 是解决树相关问题的最有效和最常用的方法之一。本节中,我们将会介绍两种典型的递归方法。解决方案本小节内容节选自 LeetCode:运用递归解决树的问题 .递归是解决树的相关问题最有效和最常用的方法之一。我们知道,树可以以递归的方式定义为一个...

2020-03-04 00:30:19 481

原创 二叉树的递归与迭代遍历

二叉树的递归与迭代遍历本文将针对二叉树中几种常见的遍历方法进行介绍。遍历方式前序遍历前序遍历首先访问根节点,然后遍历左子树,最后遍历右子树。中序遍历中序遍历是先遍历左子树,然后访问根节点,然后遍历右子树。后序遍历后序遍历是先遍历左子树,然后遍历右子树,最后访问树的根节点。递归实现递归实现二叉树的遍历是非常简单的,其核心就是 深度优先搜索(DFS) 算法。由于比较简单,...

2020-02-16 00:36:14 639

原创 栈和深度优先搜索(DFS)

与 BFS 类似,深度优先搜索(DFS)是用于在树/图中遍历/搜索的另一种重要算法。也可以在更抽象的场景中使用。正如树的遍历中所提到的,我们可以用 DFS 进行 前序遍历,中序遍历 和 后序遍历。在这三个遍历顺序中有一个共同的特性:除非我们到达最深的结点,否则我们永远不会回溯。这也是 DFS 和 BFS 之间最大的区别,BFS永远不会深入探索,除非它已经在当前层级访问了所有结点。模版递归...

2020-02-13 23:00:44 1522 1

原创 栈的设计与算法例题

栈的实现栈的实现比队列容易。动态数组 足以实现堆栈结构。这里LeetCode官方提供了一个简单的实现供参考:// "static void main" must be defined in a public class.class MyStack { private List<Integer> data; // store elements...

2020-02-12 01:50:10 611

原创 队列和广度优先搜索

广度优先搜索(BFS)的一个常见应用是找出从根结点到目标结点的最短路径。思路1. 结点的处理顺序在第一轮中,我们处理根结点。在第二轮中,我们处理根结点旁边的结点;在第三轮中,我们处理距根结点两步的结点;等等等等。与树的层序遍历类似,越是接近根结点的结点将越早地遍历。如果在第 k 轮中将结点 X 添加到队列中,则根结点与 X 之间的最短路径的长度恰好是 k。也就是说,第一次找到目标结点时...

2020-02-08 02:34:42 1572 1

原创 循环与循环双端队列

循环队列 是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为 环形缓冲器。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。为什么使用循环队列?这里我们先对 队列 的简单实现进行简单展示,队...

2020-01-20 23:12:12 1513

原创 弗洛伊德的乌龟与兔子

弗洛伊德的乌龟与兔子Floyd 判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm),是一个可以在有限状态机、迭代函数或者链表上判断是否存在环,以及判断环的起点与长度的算法。结论1、如果链表上存在环,那么在某个环上以不同速度前进的2个指针必定会在某个时刻相遇;2、根据结论1找到的相遇点可找...

2020-01-19 22:06:14 1145

原创 面向功利编程,面向Star开源? 一个开发者的2019反思总结

我是 却把清梅嗅 ,GitHub开源社区内的一个 功利 的爱好者。去年的这个时候,我同样做了一个简短的年终总结:《2018我的博客历程:你带来微笑,我有幸得到》我不是喜欢一个花时间写非技术类型文章的人,但是每年一篇年终总结于个人确实有所裨益——时隔一年再看,这篇文章段落中的一些吹嘘自己的文字,多少都让我有点尴尬。同时,我看到了过去自己一些 不成熟的想法 ,与一年后的自己的理念有所冲突,我...

2019-12-27 01:02:04 5053 5

原创 反思|Android 列表分页组件Paging的设计与实现:架构设计与原理解析

本文是Android Jetpack Paging系列的第二篇文章;强烈建议 读者将本系列作为学习Paging 阅读优先级最高的文章,如果读者对Paging还没有系统性的认识,请参考:反思|Android 列表分页组件Paging的设计与实现:系统概述前言Paging是一个非常优秀的分页组件,与其它热门的分页相关库不同的是,Paging更偏向注重服务于 业务 而非 UI 。——我们都知道...

2019-12-01 23:39:36 730

原创 反思|Android 列表分页组件Paging的设计与实现:系统概述

本文将对Paging分页组件的设计和实现进行一个系统整体的概述,强烈建议 读者将本文作为学习Paging 阅读优先级最高的文章,所有其它的Paging中文博客阅读优先级都应该靠后。

2019-10-25 17:40:56 1189 1

原创 反思|Android 事件分发机制的设计与实现

反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。概述Android体系本身非常宏大,源码中值得思考和借鉴之处众多。以整体事件分发机制为例,其整个流程涉及到了 系统启动流程(SystemServer)、输入管理(InputManager)、系统服务和UI的通信(ViewRootImpl + Window + WindowManagerService)、事件分发 等等...

2019-08-28 18:25:42 984

原创 反思|Android LayoutInflater机制的设计与实现

反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。概述Android体系本身非常宏大,源码中值得思考和借鉴之处众多。以LayoutInflater本身为例,其整个流程中除了调用inflate()函数 填充布局 功能之外,还涉及到了 应用启动、调用系统服务(进程间通信)、对应组件作用域内单例管理、额外功能扩展 等等一系列复杂的逻辑。本文笔者将针对LayoutInla...

2019-08-19 16:52:14 622

原创 反思|Android View机制设计与实现:布局流程

反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。概述Android本身的View体系非常宏大,源码中值得思考和借鉴之处众多,以View本身的绘制流程为例,其经过measure测量、layout布局、draw绘制三个过程,最终才能够将其绘制出来并展示在用户面前。相比 测量流程 ,布局流程 相对简单很多,如果读者不了解 测量流程 ,建议阅读这篇文章:反思 | An...

2019-08-13 18:03:09 497 1

原创 反思|Android View机制设计与实现:测量流程

反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。概述Android本身的View体系非常宏大,源码中值得思考和借鉴之处众多,以View本身的绘制流程为例,其经过measure测量、layout布局、draw绘制三个过程,最终才能够将其绘制出来并展示在用户面前。本文将针对绘制过程中的 测量流程 的设计思想进行系统地归纳总结,读者需要对View的measure()相...

2019-08-09 11:33:08 956 1

原创 JakeWharton评价我的代码像是在打地鼠?

【标题党警告】本文主要内容为 Gradle依赖替换规则详解。RxJava3版本迁移的血泪史不久前RxJava正式发布了3.x版本,作为RxJava的爱好者,笔者第一时间对个人项目进行了3.x版本的迁移。迁移过程中遇到了一个小问题,那就是RxAndroid因为没有及时升级,因此内部还是依赖2.x版本的RxJava,这就导致项目的依赖发生了冲突。笔者的解决方式非常简单,既然RxAndroi...

2019-07-16 23:40:59 1175 2

原创 Flutter与Android混合编码配置笔记

学习Flutter一小段时间,对纯Flutter项目有了一些基本的了解,但更趋近实际开发的应该是将Flutter模块作为一个依赖库添加到原生的Android项目中。本文笔者将尝试分享个人针对Flutter与Android混编时的配置步骤,以及踩坑过程。一、初始化Flutter-Module参考 官方文档 ,首先需要确认Flutter-Module依赖库文件夹的位置,简单来说,这里有两种方式:...

2019-07-11 20:13:01 1546 2

原创 使用Flutter开发Github客户端及学习历程的小结

本文笔者将尝试分享个人针对Flutter的 学习 并 搭建一个Flutter应用 的过程。在这一个月学习Flutter的过程中,我不可避免的走了很多弯路,也许这并非坏事,但是还是希望将这些经历表述出来,有两个目的:1.为自己做一个周期性的总结;2.也希望能给想学习Flutter的读者一定实质性的参考。关于笔者总结的Flutter入门学习计划,可直接跳转文末的 Flutter入门学习计...

2019-06-28 00:55:02 1186

原创 Android官方架构组件Paging-Ex:列表状态的响应式管理

概述Paging是Google在2018年I/O大会上推出的适用于Android原生开发的分页库,随着越来越多的开发者着手使用Paging,越来越多的问题暴露出来,最直接的一个问题是:如何管理列表额外的状态?这样的需求随处可见,比如 侧滑删除、为评论点赞 等等:本文将阐述:如何管理Paging分页列表的 状态,为何这样设计,以及设计的过程。列表的状态问题和市面上其它热门的分页库相比...

2019-05-23 23:52:53 1090 3

原创 Android官方架构组件Paging-Ex:为分页列表添加Header和Footer

争取打造 Android Jetpack 讲解的最好的博客系列:Android官方架构组件Lifecycle:生命周期组件详解&原理分析Android官方架构组件ViewModel:从前世今生到追本溯源Android官方架构组件LiveData: 观察者模式领域二三事Android官方架构组件Paging:分页库的设计美学Android官方架构组件Paging-Ex:为分页列...

2019-04-07 21:39:33 12834 7

原创 Handler原理分析

Handler的原理分析这个标题,很多文章都写过,最近认真将源码逐行一字一句研究,特此也简单总结一遍。首先是Handler整个Android消息机制的简单概括:分三部分对消息机制的整个流程进行阐述:Handler的创建,包括Looper、MessageQueue的创建;Handler发送消息,Message是如何进入消息队列MessageQueue的(入列);Looper轮询消息,M...

2019-04-03 00:39:06 869 1

原创 ThreadLocal原理分析

接下来笔者的文章方向偏向于 Android & Java 面试相关知识点系统性的总结,欢迎关注。ThreadLocal类是java.lang包下的一个类,用于线程内部的数据存储,通过它可以在指定的线程中存储数据,本文针对该类进行原理分析。通过思维导图对其进行简单的总结:一.ThreadLocal源码分析ThreadLocal类最重要的几个方法如下:get():T ...

2019-03-31 23:08:54 1285 2

翻译 [译]使用MVI打造响应式APP(八):导航

原文:REACTIVE APPS WITH MODEL-VIEW-INTENT - PART 8 - NAVIGATION作者:Hannes Dorfmann译者:却把清梅嗅在上一篇博客中,我们探讨了协调模式是如何在Android中应用的。这次我想展示如何在Model-View-Intent中使用它。如果您还不知道协调器模式是什么,我强烈建议您回过头来阅读上文内容。在MVI中应用此模...

2019-03-24 13:20:06 6700

翻译 [译]使用MVI打造响应式APP[七]:掌握时机(SingleLiveEvent问题)

原文:REACTIVE APPS WITH MODEL-VIEW-INTENT - PART7 - TIMING (SINGLELIVEEVENT PROBLEM)作者:Hannes Dorfmann译者:却把清梅嗅在之前的文章中,我们探讨了正确状态管理的重要性,以及我为什么认为使用类似 Github上Google架构组件的这个repo 中的 SingleLiveEvent 并不是一个好...

2019-03-23 16:53:58 1754

翻译 [译]使用MVI打造响应式APP(六):恢复状态

原文:REACTIVE APPS WITH MODEL-VIEW-INTENT - PART6 - RESTORING STATE作者:Hannes Dorfmann译者:却把清梅嗅在前几篇文章中,我们讨论了Model-View-Intent(MVI)和单向数据流的重要性,这极大简化了状态的恢复,那么其过程和原理是什么呢,本文我们针对这个问题进行探讨。我们将针对2个场景进行探讨:在...

2019-03-21 07:32:07 512

翻译 [译]使用MVI打造响应式APP(五):轻而易举地Debug

原文:REACTIVE APPS WITH MODEL-VIEW-INTENT - PART5 - DEBUGGING WITH EASE作者:Hannes Dorfmann译者:却把清梅嗅前文我们探讨了Model-View-Intent (MVI)架构模式及其相关特性,在 第一篇文章 中,我们谈到了 单项数据流的重要性 和 应用状态应该被业务逻辑驱动。本文我们将展示这种架构模式会怎样回...

2019-03-17 22:15:20 385

翻译 [译]使用MVI打造响应式APP(四):独立性UI组件

原文:REACTIVE APPS WITH MODEL-VIEW-INTENT - PART4 - INDEPENDENT UI COMPONENTS作者:Hannes Dorfmann译者:却把清梅嗅这篇博客中,我们将针对如何 如何构建独立组件 进行探讨,我将阐述为什么在我看来 父子关系会导致坏味道的代码,以及为何这种关系是没有意义的。有这样一个问题时不时涌现在我的脑海中—— MVI...

2019-03-15 13:34:16 389

翻译 [译]使用MVI打造响应式APP(三):状态折叠器

原文:REACTIVE APPS WITH MODEL-VIEW-INTENT - PART3 - STATE REDUCER作者:Hannes Dorfmann译者:却把清梅嗅在上一章节中,我们针对 如何使用单向流和 Model-View-Intent 模式构建一个简单的页面 进行了探讨;本章节,我们将在reducer的帮助下实现MVI模式中更加复杂的页面。如果你还未阅读前两个章节,...

2019-03-13 21:27:33 388

翻译 [译]使用MVI打造响应式APP(二):View层和Intent层

《使用MVI打造响应式APP》翻译系列[译]使用MVI打造响应式APP(一):Model到底是什么[译]使用MVI打造响应式APP[二]:View层和Intent层[译]使用MVI打造响应式APP[三]:状态合并[译]使用MVI打造响应式APP[四]:IndependentUIComponents[译]使用MVI打造响应式APP[五]:DebuggingWithEase[译]使用M...

2019-03-10 22:38:34 503

翻译 [译]使用MVI打造响应式APP(一):Model到底是什么

原文:《REACTIVE APPS WITH MODEL-VIEW-INTENT - PART1 - MODEL》作者:Hannes Dorfmann译者:却把清梅嗅有朝一日,我突然发现我对于Model层的定义 全部是错误的,更新了认知后,我发现曾经我在Android平台上主题讨论中的那些困惑或者头痛都消失了。从结果上来说,最终我选择使用 RxJava 和 Model-View-Int...

2019-03-04 00:46:32 2176

翻译 [译]Object的局限性——Kotlin中的带参单例模式

原文:Kotlin singletons with argument——object has its limits作者:Christophe Beyls译者:却把清梅嗅在Kotlin中,单例模式被用于替换该编程语言中不存在的static成员和字段。 你通过简单地声明object以创建一个单例:object SomeSingleton与类不同,object 不允许有任何构造函数,如...

2019-02-13 00:22:24 2748 1

原创 Android官方架构组件DataBinding-Ex: 双向绑定篇

争取打造 Android Jetpack 讲解的最好的博客系列:Android官方架构组件Lifecycle:生命周期组件详解&amp;amp;原理分析Android官方架构组件ViewModel:从前世今生到追本溯源Android官方架构组件LiveData: 观察者模式领域二三事Android官方架构组件Paging:分页库的设计美学Android官方架构组件Navigation:大巧不...

2019-01-15 23:48:55 5722 1

原创 Android官方架构组件LiveData: 观察者模式领域二三事

本文是 《Android Jetpack 官方架构组件》 系列的最后一篇文章,和一些朋友的观点不同的是,我认为它是 最重要 的核心组件,因为 LiveData本身很简单,但其代表却正是 MVVM 模式最重要的思想,即 数据驱动视图(也有叫观察者模式、响应式等)——这也是摆脱 顺序性编程思维 的重要一步。本文默认读者已经学习了 Lifecycle , 欢迎关注笔者的Jetpack系列:争取打...

2018-12-28 00:40:00 2833 3

空空如也

却把清梅嗅的留言板

发表于 2020-01-02 最后回复 2020-01-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除