自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

御风而行

记录点点滴滴

  • 博客(58)
  • 收藏
  • 关注

翻译 通过图文给你讲明白java GC的垃圾回收机制

本文原链接 http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html1. JAVA GC 概述JAVA GC采用了分代思想,将java堆分成新生代,年老代,永久代。GC算法主要有标记-清除,标记-压缩,复制算法。新生代:新生代被分成三个部分 eden区和2个surviv...

2018-06-13 11:54:22 18810 3

原创 Android如何优雅地解决重复Drawable资源

1. 前言最近鸿洋大神和路遥大佬分别在他们的公众号上发布了关于解决Shape/Selector冗余的方案。这篇文章在上周末就已经写好了。虽然类似的解决方案特别多,实现思路也都差不多。但我仍然要安利一下我的这个解决方案。原因有以下几点。很纯粹,就是用代码的方式实现了xml实现的Drawable,不用重写自定义View或者Hook系统的基础组件。最大程度的复刻xml所拥有的能力,甚至连单位dp还是px的api都提供好了。使用Builder模式将方法和参数都约束起来,使用起来很方便,不用去众

2022-02-25 10:01:44 857

原创 抽丝剥茧聊协程之深入理解Continuation原理

1. 前言这是新年以来的第一篇更文,在此给大家拜个晚年,祝大家在新的一年所想的都能如愿,同时感谢大家一直以来的支持和帮助。这篇文章其实在春节前就已经构思完了,本想着在留京过年期间写完,由于计划变更,回老家过年去了,春节期间大部分时间在走亲戚,文章也就搁置下来了。闲话少叙,本文我将尝试给大家讲明白,Kotlin协程如何实现用同步的方式实现异步调用。相信不少同学都能说出以下几种概念中的一个或者多个。Kotlin suspend关键字Kotlin内部的Continuation机制Continuatio

2022-02-14 20:33:13 1474

原创 抽丝剥茧聊Kotlin协程之协程异常处理机制

1. 前言如果你是第一次听说有人把异常处理和事件分发联系在一起,相信你会跟我第一次接触协程异常处理机制时一样,一脸懵逼。别说在座的各位有不少Android老司机,就算是Android萌新,也应该知道,异常处理不就是try catch这么简单的事么,怎么能和复杂的事件分发机制扯上关系?别不信还真扯的上关系。如果你已经接触协程知识有段时间,并且知道协程的异常处理机制和我们以往了解的异常处理机制不一样,但是又没能完全它的原理,我会一步一步带你搞清楚这是怎么回事。如果你对协程异常处理机制了然于胸,那么恭喜你,

2022-01-05 10:09:04 2201

原创 深入理解Kotlin协程suspend工作原理(初学者也能看得懂)

1. 概述挂起函数是Kotlin协程最重要的一个特性,所有其他概念都建立在它的基础上。所以我们需要深入了解它的工作原理。挂起协程意味着在中间停止它。这类似于玩游戏,当我们想暂停游戏时,可以先存档,想继续游戏时,可以从存档处恢复游戏。当协程被暂停时,它会返回一个Continuation. 这就像游戏中的存档,协程可以使用Continuation从挂起的地方恢复。请注意,这与线程非常不同,线程无法保存,只能阻塞。协程要强大得多,挂起时,它不消耗任何所在线程的资源。协程不一定需要在启动协程的线程上恢复,可以

2021-12-31 07:14:43 1846

原创 抽丝剥茧聊Kotlin协程之协程是如何建立结构化并发的

1. 协程的结构化并发上篇文章,我通过两个例子简单的介绍了Job cancel方法在不同的父子关系情况下,看起来很相似的代码,执行结果却很不相同的情况。文中我引出了Job结构化并发的概念,即父Job和子Job形成树的数据结构,本文我将详细介绍Kotlin协程框架是如何实现结构化并发的。什么叫结构化并发?用通俗易懂的话解释就是,协程之间的协作是有组织,有纪律的。如果协程之间的关系是确定了的,那么协程之间的cancel和exception处理是有章法可寻的。下图,假设Job2处发生了异常,那么它的子Job

2021-12-27 09:45:18 1446

原创 抽丝剥茧聊Kotlin协程之聊聊Job和SupervisorJob的区别

1. 前言随着协程的普及,协程知识越来越被面试官青睐。首先,协程的面试题一般都很简洁,一两句简单的话就能把问题描述清楚,其次于面试官而言,协程框架中精妙的数据结构与算法可以很好的考察应聘者对基础知识的掌握程度。相对于烂大街的Android八股文,它又能很好的考察应聘者的主动学习能力。所谓行家一伸手便知有没有。协程知识便是面试场景中的行家和试金石。闲话少叙,本文带大家聊聊Job和SupervisorJob的区别。2. Job和SupervisorJob的区别如果你看过协程的官方文档或视频。你应该会知道J

2021-12-27 09:44:19 2038

原创 抽丝剥茧聊Kotlin协程之Job初体验

1.前言如果要我拿现实中的一事物与Kotlin协程中的Job做一个类比,那么我会把Job比作成海洋中的冰山。自由漂浮的冰山约有90%体积沉在海水表面下,因此看着浮在水面上的形状并猜不出水下的形状。与冰山一样,Job提供给开发者的功能非常简单,但是在协程框架内部Job却做了大量的工作。至关重要的是,如果开发者不去深入了解Job内部的实现机制,那么在使用协程的过程中,他就犹如开着船与冰山擦肩而过的船长,随时有可能面临系统崩溃的风险。如果你的项目中正在使用协程,如果你想享受协程编程带来的便利的同时又想保证程序.

2021-12-17 14:09:55 2467

原创 抽丝剥茧聊Kotlin协程之深入理解协程上下文CoroutineContext

1. 前言如果你对CoroutineContext不了解,本文值得你细细品读,如果一遍看不懂,不妨多读几遍。写作该文的过程也是我对CoroutineContext理解加深的过程。CoroutineContext是协程的基础,值得投入学习Android开发者对Context都不陌生。在Android系统中,Context可谓神通广大,它可以获取应用资源,可以获取系统资源,可以启动Activity。Context有几个大名鼎鼎的子类,Activity、Application、Service,它们都是应用

2021-12-03 07:34:59 560

原创 抽丝剥茧聊Kotlin协程之协程是如何启动起来的?

1. 前言本文主要介绍协程的启动原理,如果没有协程实战经验或者没有Debug过协程的源码,看起来可能会有点费劲,但是如果将来有机会学习协程的源码,那么这篇文章可能会对你有一定的帮助。文章主要是讲解协程启动的流程,简便起见,该过程中涉及到的其它比较重要协程知识点可能只会简单提到,本文不会深入去讲解,后续有空会对他们单独成文。2. 简单的例子首先 我们来看一个简单的例子,在主线程中开启一个协程,打印“Hello Coroutines”。通过这个简单的例子讲解协程是如何启动起来的。接着我们将startC

2021-12-03 07:33:03 428 1

原创 抽丝剥茧聊Kotlin协程之协程与线程之间的区别

1. 前言关于协程,可能大家最经常听到的一句话就是“协程是轻量级的线程”。一脸懵逼,有没有?这可是官方的slogan,严格意义上讲,一方面官方是想让大家把协程和线程产生一个直观关联,另一方面想宣传协程在性能上比线程更优,充分地说服大家去使用它。本文我将尝试把协程是什么讲明白。2. 聊聊线程既然说“协程是轻量级的线程”。那我们有必要先回顾下线程是什么? 在泛Java程序中,要启动一个线程那太easy了,new一个Thread,重写run方法,调用start方法,就是这么简单。public fun th

2021-12-03 07:31:19 2436

原创 ConcatAdapter使用教程

1.前言2021年4月7日Android团队正式发布了RecyclerView 1.2.0版本。相对于1.1.0版本,它有两个主要的变化:增加了ConcatAdapter:这个Adapter方便地让我们在一个RecyclerView中连接多个Adapters。支持延迟恢复状态:RecyclerView现在支持当内容加载出来后恢复状态。本文将结合ConcatAdapter的简单使用,由浅入深地讲解ConcatAdapter的高级使用。2.简单使用实现上面是文本列表,下面是按钮列表的效果,如图:

2021-05-15 19:31:47 3890 7

原创 找出数组中只出现一次的数字

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

2021-04-09 09:54:05 789

原创 干货|详解位图算法在Android RecyclerView中的应用

1. 前言1.1 关于算法金庸武侠小说中的主人公在成为绝世高手之前,都会学习一门玄门内功。郭靖有了全真派的内功才能修炼九阴真经、虚竹得到了无崖子的毕生功力后,武学造诣日渐精进、张无忌苦练五年九阳神功,日后才能融合乾坤大挪移。对于程序员,算法就是小说中的内功,编程语言就是不同门派的武功。张无忌因为有九阳神功加持仅用一天就学会了阳顶天几十年都学不成的乾坤大挪移。一名优秀的程序员需要不断的修炼算法内功,才能取得更高的编程造诣。1.2 Algorithm&Android系列“算法在实际编程中应用很少

2021-03-22 09:36:29 218

原创 TouchDelegate的这些盲区你知道吗?

1. 前言早些时候我发了一篇关于对话框动画的文章全网独一份的对话框弹出样式。用户阅读量,分享量,阅读后关注量等数据比较好。与之前偏重Android源码解析的文章不同,那是一篇更偏实战的文章。美中不足的是,代码注释量很少,有读者反馈阅读体验不佳。如果这个问题也曾困扰过你,借此向您真诚道歉,由于行文仓促,没有投入更多精力,今后在文章润色上投入更多时间,争取为读者带来更好的阅读体验。如果您觉得我的文章写的还行,欢迎关注"字节小站"微信公众号。更多好文等着你。2. 关于TouchDelegate本文内容不仅

2021-03-18 21:32:15 221

原创 从点击处弹出的对话框你想要吗?

最近实现了一个从点击处弹出的对话框,最终效果如下:1. 接招实现对话框功能可选择的技术有 Dialog、PopupWindow、Activity。它们都支持自定义弹出和消失动画。它们都能实现自定义动画。WindowAnimationTransitionShareElement TransitionDialog支持不支持不支持PopupWindow支持支持不支持Activity支持支持支持WindowAnimation动画必须要在style

2021-03-15 17:56:27 233

原创 面试官:RecyclerView布局动画原理了解吗?

前言温馨提示:文章有点长,建议关注微信公众号“字节小站”收藏阅读本文主要通过以下几个方面来讲解RecyclerView的布局和动画原理:布局放置:RecyclerView#dispatchLayout()预布局阶段:RecyclerView#dispatchLayoutStep1()布局阶段:RecyclerView#dispatchLayoutStep2()开启动画阶段:RecyclerView#dispatchLayoutStep3()背景知识RecyclerView的Adapte

2021-02-22 09:37:22 387

原创 聊聊写作那些事

我已经连续半年在字节小站公众号发表了13篇原创Android技术文章,经过这段时间的历练,我已经度过了畏首畏尾的新手阶段,变得淡定自若,驾轻就熟。我刚开始萌发写文章的念想时,产生过这些顾虑:我的写作水平并不好,写出来的文章会不会贻笑大方?我没有粉丝,写出来的文章会有人看吗?没有美术功底,怎么能让文章排版好看?如果工作比较忙,没有时间继续写作怎么办?写作的过程中,会碰到一些自己之前根本没有接触过但是一时半会又学不来的技能,该怎么办?这些都是我前进路上的绊脚石,还没开始做,就已经想好了各种困难的情况,这就是所谓

2021-02-16 22:29:59 135

原创 ViewCompat.offsetTopAndBottom翻车现场

引言去年我开源了一个RecyclerView吸顶库,关于它的介绍请大家移步“我开源了一个RecyclerView吸顶库”一文。别看这个库大量使用了泛型,对象池、链表等技术,但是吸顶的功能真正倚仗的只有ViewCompat.offsetTopAndBottom(View view,int offset)这一个方法。它能够帮我们实现将View上下平移。它的姐妹方法offsetLeftAndRight(View view, int offset)可以实现将View左右平移,一般情况使用它们实现平移效果非常简单,

2021-02-16 16:46:30 1301

原创 BottomSheetBehavior实现高德地图首页效果之原理篇

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

2021-01-31 16:48:46 4662 7

原创 使用AppBarLayout实现二次吸顶功能

我开源了一个方便RecyclerView吸顶的Android库,欢迎您访问https://github.com/lizijin/StickyHeaderForRecyclerView,如果您使用本库,请提出您的宝贵意见。它目前支持以下功能:支持单类型吸顶功能支持多类型吸顶功能支持开启和关闭吸顶功能支持指定位置吸顶功能支持设置吸顶偏移量支持自定义RecyclerView上Item吸顶边界自定义可以无缝配合AppBarLayout开门见山,最近需要实现一个二次吸顶的效果,UE给出的效果

2020-12-17 09:42:05 1943 1

原创 手撸了个很容易实现京东购物车吸顶功能的Android库

手撸了很容易实现京东购物车吸顶功能的Android库,奉上京东购物车截图。后续会给出更多关于该库的文章。敬请关注。介绍StickyHeaderForRecyclerView库主要的功能是方便RecyclerView实现吸顶功能。它目前支持以下功能:支持单类型吸顶功能支持多类型吸顶功能支持开启和关闭吸顶功能支持指定位置吸顶功能支持设置吸顶偏移量支持自定义RecyclerView上Item吸顶边界自定义可以无缝配合AppBarLayout效果支持单类型吸顶功能支持多类型吸

2020-12-17 09:34:07 364

原创 史上最好的Android事件分发文章

Android事件分发是一个老生常谈的知识点。日常开发和求职过程中,都会碰到Android事件分发的问题。Android的控件分为两类,ViewGoup和View。ViewGroup是控件的容器,可以包含多个子控件。View是控件的最小单位,它不能包裹其它的View。Android的ViewGroup对应的数据结构是树。网上的事件分发的文章大多数是用线性的思维去分析控件树的事件遍历,我深以为不妥,经常让读者云里雾里,只见树木不见森林。本文我将从树的深度遍历来讲解DOWN事件的分发流程,从单链表的线性.

2020-11-23 20:34:27 2251

原创 Android嵌套滑动机制分析

温馨提示:Android事件分发机制是Android嵌套滑动机制的基石,阅读本文前请务必保证熟练掌握Android事件分发机制。传送门->Android事件分发机制本文大纲1. 嵌套ScrollView同向滑动2. 传统事件分发和嵌套滑动事件分发3. NestedScrollingChild和NestedScrollingParent4. NestedScrollingChildHelper和NestedScrollingParentHelper5. 结合案例讲解嵌套滑动事件分发顺序1.

2020-11-23 18:06:56 812

原创 Flutter Widget更新机制

众所周知,Flutter中的UI都是通过Widget来呈现给用户看的。Android中的UI我们都很了解,主要是通过View和ViewGroup来呈现给用户看的。Android view或ViewGroup的属性,子View的添加删除,生命周期管理,测量,布局,绘制等操作都是由View或ViewGroup本身来管理的。然而Flutter中属性,配置等信息是由Widget来管理的。Widget的增加...

2020-01-14 09:45:04 1630

原创 Java并发系列之八Semaphore

前面我已经讲解过了CountDownLatch和CyclicBarrier。本篇我们来讲解下Semaphore。Semaphore是指信号量,在计算机的世界里信号量可以使用在数据竞争的场景中。在生活中交通信号灯可以比作现实世界中的Semaphore。Semaphore的作用就是允许或者禁止。比如说红灯禁止通行,绿灯允许通行。计算机世界里的Semaphore会持有多张许可证,举个例子有10张许可证...

2019-07-16 12:01:53 156

翻译 为什么要用Kotlin代替Java

我想告诉你一个名为Kotlin的新编程语言,以及为什么你应该为你的下一个项目考虑它。我曾经更喜欢Java,但去年我发现自己只要能够编写Kotlin,在这一点上我真的想不出Java会是一个更好的选择。它是由JetBrains开发的,事实上这些是IDE套件背后的人,比如IntelliJ和ReSharper, 在Kotlin中真的很闪亮。它实用而简洁,使编码成为令人满意和高效的体验。虽然Kotlin...

2019-07-08 12:53:48 5288

原创 Java并发系列之7 深入理解线程池ThreadPoolExecutor

1. 初识线程池线程池解决了如下两个问题当执行大量的异步任务时,线程池可以减少每个任务的调用切换开销从而提高应用性能对执行的线程,和要被执行的任务,提供了管理的方法此外每个线程池还维护了一些基本统计信息,比如已完成任务的数量2. ThreadPoolExecutor的简单使用我们创建一个线程池对象ThreadPoolExecutor,让线程池执行10个打印任务,输出当前任务名称以及...

2019-07-07 18:11:23 409

原创 ThreadLocal实现原理分析

大概有一年多的时间没有更新过文章了,要想输出一篇优质的文章需要耗费很多精力。可能是之前太过于懒惰了吧,经过一段精力的消耗,渐渐地失去了一些动力。但是写文章虽然耗时,但是有个好处就是在复习一些知识点的时候,只需要查看之前写的博客,在很短的时间内就能把知识点回想起来。曾经的初中老师总是唠叨说好记性不如烂笔头。看来是“诚不欺我呀!”。希望之后还是能保持一定的更新节奏,把对技术的思考都记录下来。跟大家一起...

2019-06-26 12:06:27 1207

原创 Kotlin标准函数run with let also apply的区别

Kotlin的Standard.kt中的一些函数很相像,很多时候我们不确定使用哪个。这篇文章我将教大家如何区分他们的不同,以及如何在正确的场景下使用正确的函数Standard.kt中有 run,T.run,with,T.apply,T.also,T.let几个函数,他们的共同的功能都是执行程序。但是他们之间还是有区别的。一共有6个函数。我将根据返回值以及block函数的参数对它归类T....

2018-10-18 15:00:24 956

原创 手把手教你使用Android Paging Library

当我们用RecyclerView来展示服务器返回的大量数据时,通常我们都需要实现分页的效果。以前我们都是通过监听RecyclerView的滚动事件,当RecyclerView滑动到底部的时候再次请求网络,把数据展示到RecyclerView上。现在Google提供了一个分页库来帮助开发者更轻松的实现在RecyclerView中逐步而且优雅地加载数据本文我将以Google官方提供的PagingWi...

2018-10-13 10:33:30 2740 2

原创 Android Studio 开启Annotation Processor断点调试

往gradle.properties文件中添加如下两行(本教程中是在~/.gradle/gradle.properties文件中添加)org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005org.gradle.daemon=trueAndroid Studio Edi...

2018-09-19 15:37:42 1247

原创 FileProvider使用以及源码浅析

1. FileProvider的使用1.1 AndroidManifest.xml中定义 <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.peter.jiangbin.fileprovider" ...

2018-07-26 09:34:44 784

原创 从头到尾给你讲明白Android View实现原理

Activity是Android开发者写第一行代码起就开始接触到的。而在onCreate方法中调用setContentView(R.layout.main_activity),恐怕也是绝大多数开发者的头等任务。然后我们可以调用findViewById(R.id.xxx)来获取布局中的某一个View。通过给View设置点击事件的监听来响应用户的操作。就这么简单我们和Android的View过了一段幸...

2018-07-22 23:12:17 4068

原创 Android系统服务启动顺序

系统服务启动分为三类 1. startBootstrapServices() 2. startCoreServices() 3. startOtherServices()startBootstrapServices 1. 启动Installer服务 2. 启动ActivityManagerService,Installer服务赋值给AMS 3. 启动Powe...

2018-07-21 15:45:15 1784

原创 OkHttp源码详解之二完结篇

1. 请大家思考几个问题在开始本文之前,请大家思考如下几个问题。并请大家带着这几个问题,去本文寻找答案。如果你对下面几个问题的答案了如指掌那本文可以略过不看在浏览器中输入一个网址,按回车后发生了什么?Okhttp的TCP连接建立发生在什么时候?Okhttp的Request请求发生在什么时候?Okio与Okhttp是在什么时候发生关联的?Okhttp的Interceptor和Cha...

2018-07-10 23:06:37 391

原创 OkHttp源码详解之Okio源码详解

请在电脑上阅读,效果更佳本文将从两个技术点讲解OkHttp 1. 讲解Okio,因为Okhttp的IO操作都是基于Okio,抛开Okio的OkHttp讲解是不完美的 2. 讲解OkHttp源码Okio1. Okio简介引用官方的一段介绍Okio是一个补充java.io和java.nio的库,使访问,存储和处理数据变得更加容易。 它最初是作为Android中包含的功能...

2018-07-08 13:09:55 1053

原创 Android Context ContextWrapper ContextImpl Activity Service关系

初识Context对于Android开发者来说,Activity应该是接触到最早的四大组件之一。Activity可以渲染layout生成控件,可以获取图片资源、文本资源、动画资源等等,还可以启动另一个Activity,启动一个后台的Service。每个Activity都有一个Context,通过这个Context我们几乎可以做任何我们想做的事情。比如通过context.getSystemSer...

2018-07-03 18:12:07 3007 2

原创 Java命令行调试程序

第一部分 进入调试模式通过jre提供的jdb程序可以实现命令行调试java程序。关于jdb的命令语法可以参考 官方文档。下面我讲通过实例手把手将大家学会命令行调试Step 1 创建项目1. mkdir -p ~/jdwp/src/main/java/com/jdwp/test2. cd ~/jdwp/src/main/java/com/jdwp/test3. t...

2018-06-29 14:14:53 11327

原创 Java命令行参数详解

最近在学习Gradle相关的知识。下载Gradle源码后,未能成功导入IDEA运行。所以想另辟蹊径,通过命令行来调试运行Gradle程序。经过一番搜索和思考。发现Java通过jdwp可以远程调试java程序的。在实践的过程中,对一些命令行参数的含义不是特别清楚。故有此篇文章。1. java命令 Oracle官方文档链接java命令是用来启动一个Java程序的。2. 概览ja...

2018-06-29 14:13:02 22459

空空如也

空空如也

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

TA关注的人

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