Java
文章平均质量分 96
却把清梅嗅
Android开发者,爱好写作,曾多次作为嘉宾受邀参加GDG (Google Developer Groups)线下活动进行分享。
展开
-
中秋节听夜曲,Android OpenGL 呈现周董专属的玉兔主题音乐播放器
前几天发现QQ音乐有个好玩的功能,为用户提供了多种播放器主题,其中原神的主题让我眼前一亮:当然,诸如换肤、主题类的功能已经屡见不鲜,但这类沉浸式播放器的听歌体验确实不错。见猎心喜,正好中秋马上就到,我也尝试整个中秋主题音乐播放器试试水。整体思路有2点:首先是技术方面,纯粹的ImageView图层堆砌来实现,渲染效率太低OpenGL是一个不错的技术方案(QQ应该也是这么实现的),顺便复习下图形学的知识。其次是玩法上,干脆在基础的功能上加一些更好玩的。原创 2023-09-21 23:34:52 · 788 阅读 · 0 评论 -
[译] 编写AndroidStudio插件(二):持久化数据
原文:Write an Android Studio Plugin Part 2: Persisting data作者:Marcos Holgado译者:却把清梅嗅《编写AndroidStudio插件》系列是 IntelliJ IDEA 官方推荐的学习IDE插件开发的博客专栏,希望对有需要的读者有所帮助。在本系列的第一部分中,我们了解了如何为Android Studio创建一个基本的插件,并编写了第一个Action。本文我们将了解如何在插件中对数据进行持久化。请记住,您可以在GitHub上找.翻译 2021-01-22 17:53:25 · 2526 阅读 · 1 评论 -
[译] 编写AndroidStudio插件(一):创建一个基本插件
原文:Write an Android Studio Plugin Part 1: Creating a basic plugin作者:Marcos Holgado译者:却把清梅嗅《编写AndroidStudio插件》系列是 IntelliJ IDEA 官方推荐的学习插件IDE开发博客专栏,希望对有需要的读者有所帮助。早在10月的时候,我就在Droidcon UK 2018上针对如何在Android Studio上创建自己的插件,以及如何使所有相关操作自动化进行了讨论。因为当时我并没有很多时间对.翻译 2021-01-21 20:38:55 · 4183 阅读 · 2 评论 -
反思 | 事件总线的局限性,组件化开发流程中通信机制的设计与实现
反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 。背景诸如EventBus\RxBus\LiveDataBus的事件总线库在业内正遭滥用。诚然,事件总线看起来 小而美 ,但随着业务复杂度上升,事件的发送和订阅到处分布,这个优势反而成为了负担,因此,笔者不建议在任何量级的项目中使用事件总线库。更多原因读者可参考 这篇文章 。更合理的方案是什么呢?在量级较小的项目中,开发者应该通过 依赖注入 将Callback进行不同层级的依次传递,以保证 层级间的依赖关系足够清晰。而对于.原创 2021-01-16 20:35:05 · 11772 阅读 · 12 评论 -
哈希映射用法及算法例题
本文为博主算法学习过程中的学习笔记,主要内容来源于其他平台或书籍,出处请参考下方 参考&感谢 一节。用法哈希映射 是用于存储 (key, value) 键值对的一种实现。使用哈希映射的第一个场景是,我们 需要更多的信息,而不仅仅是键。然后通过哈希映射 建立密钥与信息之间的映射关系。另一个常见的场景是 按键聚合所有信息。我们也可以使用哈希映射来实现这一目标。例题1、两数之和...原创 2020-03-09 01:06:01 · 7922 阅读 · 2 评论 -
哈希集合用法及算法例题
本文为博主算法学习过程中的学习笔记,主要内容来源于其他平台或书籍,出处请参考下方 参考&感谢 一节。用法哈希集 是集合的实现之一,它是一种存储 不重复值 的数据结构。因此,通常,使用哈希集来检查该值是否已经出现过。让我们来看一个例子:给定一个整数数组,查找数组是否包含任何重复项。这是一个典型的问题,可以通过哈希集来解决。你可以简单地迭代每个值并将值插入集合中。 如果...原创 2020-03-09 01:05:19 · 2431 阅读 · 0 评论 -
哈希表原理及简单设计
本文为博主算法学习过程中的学习笔记,主要内容来源于其他平台或书籍,出处请参考下方 参考&感谢 一节。介绍哈希表 是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。有两种不同类型的哈希表:哈希集合 和 哈希映射。哈希集合是 集合 数据结构的实现之一,用于存储 非重复值。哈希映射是 映射 数据结构的实现之一,用于存储(key, value)键值对。通过选择合适的...原创 2020-03-09 01:04:44 · 1574 阅读 · 0 评论 -
运用递归解决二叉树相关问题
在之前的章节中,我们已经介绍了如何解决树的遍历问题。我们也已经尝试过使用递归解决树的为 前序遍历 、 中序遍历 和 后序遍历 问题。事实上,递归 是解决树相关问题的最有效和最常用的方法之一。本节中,我们将会介绍两种典型的递归方法。解决方案本小节内容节选自 LeetCode:运用递归解决树的问题 .递归是解决树的相关问题最有效和最常用的方法之一。我们知道,树可以以递归的方式定义为一个...原创 2020-03-04 00:30:19 · 933 阅读 · 0 评论 -
二叉树的递归与迭代遍历
二叉树的递归与迭代遍历本文将针对二叉树中几种常见的遍历方法进行介绍。遍历方式前序遍历前序遍历首先访问根节点,然后遍历左子树,最后遍历右子树。中序遍历中序遍历是先遍历左子树,然后访问根节点,然后遍历右子树。后序遍历后序遍历是先遍历左子树,然后遍历右子树,最后访问树的根节点。递归实现递归实现二叉树的遍历是非常简单的,其核心就是 深度优先搜索(DFS) 算法。由于比较简单,...原创 2020-02-16 00:36:14 · 1067 阅读 · 0 评论 -
栈和深度优先搜索(DFS)
与 BFS 类似,深度优先搜索(DFS)是用于在树/图中遍历/搜索的另一种重要算法。也可以在更抽象的场景中使用。正如树的遍历中所提到的,我们可以用 DFS 进行 前序遍历,中序遍历 和 后序遍历。在这三个遍历顺序中有一个共同的特性:除非我们到达最深的结点,否则我们永远不会回溯。这也是 DFS 和 BFS 之间最大的区别,BFS永远不会深入探索,除非它已经在当前层级访问了所有结点。模版递归...原创 2020-02-13 23:00:44 · 8444 阅读 · 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 · 2191 阅读 · 0 评论 -
队列和广度优先搜索
广度优先搜索(BFS)的一个常见应用是找出从根结点到目标结点的最短路径。思路1. 结点的处理顺序在第一轮中,我们处理根结点。在第二轮中,我们处理根结点旁边的结点;在第三轮中,我们处理距根结点两步的结点;等等等等。与树的层序遍历类似,越是接近根结点的结点将越早地遍历。如果在第 k 轮中将结点 X 添加到队列中,则根结点与 X 之间的最短路径的长度恰好是 k。也就是说,第一次找到目标结点时...原创 2020-02-08 02:34:42 · 2514 阅读 · 1 评论 -
循环与循环双端队列
循环队列 是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为 环形缓冲器。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。为什么使用循环队列?这里我们先对 队列 的简单实现进行简单展示,队...原创 2020-01-20 23:12:12 · 2418 阅读 · 0 评论 -
弗洛伊德的乌龟与兔子
弗洛伊德的乌龟与兔子Floyd 判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm),是一个可以在有限状态机、迭代函数或者链表上判断是否存在环,以及判断环的起点与长度的算法。结论1、如果链表上存在环,那么在某个环上以不同速度前进的2个指针必定会在某个时刻相遇;2、根据结论1找到的相遇点可找...原创 2020-01-19 22:06:14 · 2095 阅读 · 0 评论 -
Android官方架构组件Paging-Ex:为分页列表添加Header和Footer
争取打造 Android Jetpack 讲解的最好的博客系列:Android官方架构组件Lifecycle:生命周期组件详解&原理分析Android官方架构组件ViewModel:从前世今生到追本溯源Android官方架构组件LiveData: 观察者模式领域二三事Android官方架构组件Paging:分页库的设计美学Android官方架构组件Paging-Ex:为分页列...原创 2019-04-07 21:39:33 · 13328 阅读 · 7 评论 -
ThreadLocal原理分析
接下来笔者的文章方向偏向于 Android & Java 面试相关知识点系统性的总结,欢迎关注。ThreadLocal类是java.lang包下的一个类,用于线程内部的数据存储,通过它可以在指定的线程中存储数据,本文针对该类进行原理分析。通过思维导图对其进行简单的总结:一.ThreadLocal源码分析ThreadLocal类最重要的几个方法如下:get():T ...原创 2019-03-31 23:08:54 · 1505 阅读 · 2 评论 -
Java8 LinkedList源码分析
学习动机Java Collection库中有三类:List,Queue,Set;而List接口,有三个子实现类:ArrayList,Vector,LinkedList。LinkedList采用的双向链表结构,和ArrayList的数组结构不同,链表结构的优势就是便于大量的数据添加和删除,但对于ArrayList擅长的数据查询则并非擅长。本文进行LinkedList源码的分析。构原创 2017-08-02 11:25:02 · 1003 阅读 · 0 评论 -
Java8 ArrayList源码分析
学习动机ArrayList是我日常Android开发中使用频率最高的数据容器类,非常简单的接口,底层为数组结构,有序性可以保证我们按照索引获取我们想要的数据。不论是想进阶学习Java,或者想加深对数据结构的理解,甚至想要在面试中达到游刃有余逼格满分,学习分析Java容器类的源码都是不错的选择。Java Collection库中有三类:List,Queue,Set;而List接口,有三个子实现类:Ar原创 2017-07-26 21:04:30 · 1198 阅读 · 0 评论 -
Java代理模式分析总结
动机学习动机来源于RxCache,在研究这个库的源码时,被这个库的设计思路吸引了,该库的原理就是通过动态代理和Dagger的依赖注入,实现Android移动端Retrofit的缓存功能。既然在项目中尝试使用这个库,当然要从设计的角度思考作者的思路,动态代理必然涉及到Java的反射,既然是反射,性能当然会有所降低,那么是否有更好的思路呢,使用动态代理的优势有哪些?关于动态代理,百度上面的资料数不胜数,原创 2017-10-27 23:06:36 · 579 阅读 · 0 评论 -
Android 单元测试 Mockito使用详解
简介什么是mock测试,什么是mock对象?先来看看下面这个示例:从上图可以看出如果我们要对A进行测试,那么就要先把整个依赖树构建出来,也就是BCDE的实例。一种替代方案就是使用mocks 从图中可以清晰的看出 mock对象就是在调试期间用来作为真实对象的替代品。 mock测试就是在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试。用四个字简单概括,原创 2017-08-09 20:01:48 · 11942 阅读 · 4 评论 -
Groovy学习笔记(四):特殊注解
1.@Canonical如果要编写的toString()方法只是简单地显示以逗号分隔的字段值,则可以使用@Canonical变换让Grooovy编译器帮来干这个活。默认情况下,它生成的代码会包含所有字段。不过可以让它仅包含特定字段,而去掉其他字段。@Canonicalclass Student { String firstName String lastName...原创 2018-04-09 23:01:48 · 2345 阅读 · 0 评论 -
Android 用Groovy实现扇贝阅读APP的自动阅读功能
动机最近因为想要英语学习,特下载了「扇贝阅读」App,保证自己抽空能够提升一下自己的英语水平。这个App有一个功能,就是打卡功能,每天成功阅读完两篇英语短文,就能完成每日打卡,并领取一些奖励。问题就出现在这里,因为这个App的设定是,如果天天都坚持打卡,那么你就能持续的获得奖励,这些奖励可用来兑换付费的英语书。为了保证能够最大化每日奖励,我就必须坚持阅读打卡,平时这个设定没啥问题,但是有时候(就是前原创 2018-05-02 20:15:28 · 3243 阅读 · 1 评论 -
RxImagePicker:从零实现灵活且可高度定制的Android图片选择架构
前言RxImagePicker : 支持RxJava2响应式流、灵活可高度定制的Android图片选择器。这是我花费了数月闲暇时间从零开始写的一个库,在这期间,我学习到了很多,我想把自己的一些所得所感,以及这期间的一些思路,能够通过一篇文章的形式讲述出来,这就是本文的起源。一.动机在展开本文之前,我希望能够占用一些篇幅先自我回答三个问题: 1. 为什么要”重复”造轮子?...原创 2018-05-06 15:31:42 · 2476 阅读 · 3 评论 -
如何通俗理解设计模式及其思想
本文由 玉刚说写作平台 提供写作赞助 原作者:却把清梅嗅 原文地址:https://mp.weixin.qq.com/s/T6ZCQRydzFgVUezlywC8Zw 版权声明:本文版权归微信公众号 玉刚说 所有,未经许可,不得以任何形式转载! 术与道数据结构,算法,设计模式被认为是程序员必备技能的三叉戟,如果说编程语言的语法特性和业务编码能力是【术】,...原创 2018-07-08 20:36:52 · 24218 阅读 · 12 评论 -
Kotlin中用DSL代替建造者模式
原文:Kotlin-ifying a Builder Pattern 原文地址:https://medium.com/google-developers/kotlin-ifying-a-builder-pattern-e5540c91bdbe 原文作者:Doug Sigelbaum 翻译:却把清梅嗅在Java语言中,当一个对象的实例化需要多个参数时,建造者模式(Bui...翻译 2018-07-12 13:34:51 · 2095 阅读 · 2 评论 -
Java将Powermock和Mockito搭配进行单元测试
本文为Powermock官方文档Mockito篇的中文翻译 原文:https://github.com/powermock/powermock/wiki/Mockito 翻译:却把清梅嗅简介Powermock提供了基础的PowerMockito类,你仍然可以通过初始化 mock/object/class 并配置它们的校验、期望行为、或者其他,以达到通过Mockito...翻译 2018-07-19 15:44:33 · 7893 阅读 · 0 评论 -
Linux配置JDK和Tomcat
最近将公司的项目部署了Jenkins持续集成,遇到了几个麻烦的点,其中之一就是对JDK和Tomcat的配置,特此记录。本地系统:MacOS远程系统:CentOS_7_04_64_20G_alibase_201701015.vhd1.安装jdkyum search java|grep jdk 查看yum库中都有哪些jdk版本yum install java-1.8.0-openjdk...原创 2018-10-10 23:05:38 · 1365 阅读 · 0 评论 -
Android官方架构组件LiveData: 观察者模式领域二三事
本文是 《Android Jetpack 官方架构组件》 系列的最后一篇文章,和一些朋友的观点不同的是,我认为它是 最重要 的核心组件,因为 LiveData本身很简单,但其代表却正是 MVVM 模式最重要的思想,即 数据驱动视图(也有叫观察者模式、响应式等)——这也是摆脱 顺序性编程思维 的重要一步。本文默认读者已经学习了 Lifecycle , 欢迎关注笔者的Jetpack系列:争取打...原创 2018-12-28 00:40:00 · 3907 阅读 · 3 评论 -
[译]使用MVI打造响应式APP(六):恢复状态
原文:REACTIVE APPS WITH MODEL-VIEW-INTENT - PART6 - RESTORING STATE作者:Hannes Dorfmann译者:却把清梅嗅在前几篇文章中,我们讨论了Model-View-Intent(MVI)和单向数据流的重要性,这极大简化了状态的恢复,那么其过程和原理是什么呢,本文我们针对这个问题进行探讨。我们将针对2个场景进行探讨:在...翻译 2019-03-21 07:32:07 · 731 阅读 · 0 评论 -
Java8 HashMap源码分析
概述相比较Java7中的链表组合存储,Java8中的HashMap有了大量改进,最为明显的就是Java8中采用数组+链表+红黑树的方式对元素进行存储,这样安全和功能性完备的情况下让其速度更快,同时减少了哈希冲突的情况。HashMap的主结构类似于一个数组,添加值时通过key确定储存位置.每个位置是一个Node(图中黑点)的数据结构,该结构可组成链表.当发生冲突时,相同hash值的键值对会组成链表.原创 2017-08-07 20:16:22 · 1294 阅读 · 0 评论