自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 2022年终总结:生活就像一道过山车

又到了年末,今年的年终总结我考虑了很久,到底要不要写?可以写些什么?今年过得十分匆忙,我一直在赶路,但事实上今年内做完的,能说出口的事可以说没有。

2022-12-31 23:54:06 752 1

原创 同学们上课,今天我们学习:UI 操作一定要在 UI 线程吗?

叮铃铃,叮铃铃,“今天没有BUG”小课堂打铃上课了,一位长相极其帅气的讲师进入教室,教室中间,路人甲、乙、丙三位同学头戴红领巾坐下,双手平放在桌上准备认真听课。老师在黑板写下今天的问题:“更新UI的操作,一定要在 UI 线程中进行吗?不在 UI 线程可不可以?”同学甲回答:众所周知,更新 UI 的操作一定要在 UI 线程进行,否则程序会崩溃。老师点点头,在黑板上奋笔疾书,让同学们检查下面这段代码:<RelativeLayout xmlns:android="http://schemas.and

2022-05-09 16:08:16 1038 4

原创 一个解决滑动冲突新思路,做到视图之间无缝地嵌套滑动

在此文章开始之前,我想抛出一个问题:如何解决滑动冲突?用传统的思路解决,你可能会从 View 的 onInterceptTouchEvent() 和 onTouchEvent() 方法入手,根据业务的情况以及手指滑动的方向,按需拦截事件来解决视图之间的滑动冲突。这种思路没有错,可以完美解决视图之间的滑动冲突。但这种思路有个局限,它无法解决嵌套滑动问题。为什么呢?因为目前绝大多数的滚动组件(RecyclerView,ScrollView,ListView等),我们翻看它们的源码,都可以看到它们在处理

2022-04-26 00:00:01 2662 2

原创 安卓基础知识之View篇(四):View 事件滑动冲突解决方案

安卓基础知识系列旨在简明扼要地提供面试或工作中常用的基础知识,让对安卓还不太熟悉的小伙伴更快地入门。同时自己在工作中,也没法完全记住所有的基础细节,写这样的系列文章,可以让自己形成一个更完备的知识体系,同时给自己日后留个知识参考。开始的开始有了对事件分发机制的理解之后,我们知道事件是从顶层ViewGroup一层一层往下分发的,常用的事件类型有,按下事件(down)、滑动事件(move)、抬起事件(up)、触摸事件(touch)等,在处理滑动事件中,我们经常会碰到滑动冲突的场景。考虑一种布局由Scro.

2022-03-28 13:11:14 5028 1

原创 安卓基础知识之View篇(三):源码分析 View 事件分发机制

安卓基础知识系列旨在简明扼要地提供面试或工作中常用的基础知识,让对安卓还不太熟悉的小伙伴更快地入门。同时自己在工作中,也没法完全记住所有的基础细节,写这样的系列文章,可以让自己形成一个更完备的知识体系,同时给自己日后留个知识参考。开始的开始本篇文章基于 Android 12.0 版本,会从源码角度来体会事件从顶层 ViewGroup 往下传递的过程,以及 View 是如何处理传递过来的事件的。正文还记得备忘录里记的结论吗,如果你还不是很了解 View 事件传递机制的原理,直接看备忘录的结论可能会.

2022-02-22 11:18:52 1631

原创 安卓基础知识之View篇(二):View 事件分发机制备忘录

安卓基础知识系列旨在简明扼要地提供面试或工作中常用的基础知识,让对安卓还不太熟悉的小伙伴更快地入门。同时自己在工作中,也没法完全记住所有的基础细节,写这样的系列文章,可以让自己形成一个更完备的知识体系,同时给自己日后留个知识参考。开始的开始View 事件分发机制是我觉得非常有意思的内容,依稀记得我第一次看完时恍然大悟的感觉,不禁赞叹设计者优秀的开发思维,居然能想到这么有才的事件分发方法,我内心十分佩服。今天回过头来重温了一遍事件分发机制的内容,我依然觉得精彩,本篇内容就让我们来探究 View 的事件.

2022-02-21 21:57:01 1735

原创 安卓基础知识之View篇(一):View 必须要知道的基础知识

安卓基础知识系列旨在简明扼要地提供面试或工作中常用的基础知识,让对安卓还不太熟悉的小伙伴更快地入门。同时自己在工作中,也没法完全记住所有的基础细节,写这样的系列文章,可以让自己形成一个更完备的知识体系,同时给自己日后留个知识参考。开始的开始View 是除了安卓四大组件以外用的最多的控件,我们需要利用 Android 内置的 View 控件(TextView、LinearLayout等)完成业务需求,有时甚至需要自定义控件来满足特殊的业务需求。View 还负责与用户的交互(点击、滑动、长按等操作),掌.

2022-02-11 16:23:35 3517 1

原创 QQ主页抽屉效果实现,有趣的弹簧动效

最近在测试机玩QQ的时候,留意到QQ主页上抽屉的动画效果,觉得挺有意思,今天就来实现以下QQ主页的抽屉动效。抽屉打开的时候,可以看到主页是有两个动作:主界面收缩主界面四周圆角度数变大接下来就一步步实现QQ抽屉打开时的效果。

2022-01-21 10:50:36 3128 2

原创 Kotlin 静态内部类单例模式的正确实现方式

本篇是对现网上流传的 Kotlin 实现静态内部类单例模式的纠正,为了把原理说清楚,文章前奏可能会有些长,熟悉静态内部类单例模式原理的朋友,可以直接跳转到文章最后,直接看结果即可。最近在整理基础库的时候,需要一个基础类来存储初始化的数据,例如应用的 Application Context,用户的登录 token 等等信息,这些基本都是应用全局类的信息,在应用的整个生命周期都会用到,因此我将这个基础类设计为单例模式来优化性能。我知道的单例模式就有6钟,饿汉式、懒汉式、线程安全的懒汉式,volatile.

2022-01-14 18:08:50 5216 1

原创 Flutter 异步机制:Event Loop

在阅读本文章之前,我强烈建议大家先看一遍这篇文章:Dart 异步编程:Isolates and event loops,也是与 event loop 有关的知识,内容非常通俗易懂,算是一篇 event loop 的基础导读,看完这篇文章再回来看本文,相信会有更好的理解效果。在安卓中,每个程序都有一个 Looper,运行在主线程中,这个 Looper 会在执行 main() 函数时进行初始化,在 Looper 初始化的同时还会创建 Message Queue,message queque 用于存储一个.

2022-01-09 22:14:33 1743

翻译 Dart 异步编程:Isolates and event loops

最近在看 Flutter 的 Future,翻到这篇文章,文章写地挺不错的,虽然没有涉及到什么深度,但作为一篇 Dart 异步编程的基础知识可好。文章来源于 Medium,文章在我的理解基础上做了些加工,英文好的朋友可以直接去读原文。Dart,尽管是一种单线程语言,但它提供了对 Future、Streams、后台工作的支持,以及提供了所有需要以现代、异步和反应(例如Flutter)等方式编写的东西的支持。这篇文章介绍了支持后台工作的基础:Isolates and event loops (隔离和时间.

2022-01-07 10:55:18 305

原创 2021年终总结:平凡的一年

今天是2021年最后一天,本来没想写年度总结,但是一大早起床看见了郭神公众号推送的2021年年度总结提醒了我一下,加上刚考完试有时间,我寻思我也来总结总结吧!犹记得他去年发布年度总结时给我带来的震撼——获评谷歌GDE,入职微软。看完他去年的年度总结,仿佛他跟我不在同一个世界,他已经超脱化神了!郭神一直是我的榜样,谷歌GDE,CSDN博客之星、运营微信公众号、维护自己的开源项目,撰写第一行代码第二行代码,当初就是看了他的第一行代码,才入了安卓的坑,此后我也一直关注着他的文章更新,可以说他一直是我的引路人。

2021-12-31 15:30:51 1281 4

原创 安卓基础知识之Activity篇(二):Activity四大启动模式

安卓基础知识之Activity篇(二):Activity四大启动模式安卓基础知识系列旨在提供面试或工作中常用的基础知识,让对安卓还不太熟悉的小伙伴更快地入门。同时自己在工作中,也没法完全记住所有的基础细节,写一篇这样系列,可以给自己日后留个知识参考。开始的开始安卓四大组件中,最常用的组件莫过于我们的 Activity 组件。安卓程序员每天都在直接或间接地接触着 Activity,所以 Activity 基础知识的重要性不言而喻。 正文Activity有四种启动模式:Standard:标准

2021-11-10 13:25:21 2264

原创 安卓基础知识之Activity篇(一):Activity生命周期

安卓基础知识之Activity篇(一):Activity生命周期安卓基础知识系列旨在简明扼要地提供面试或工作中常用的基础知识,让对安卓还不太熟悉的小伙伴更快地入门。同时自己在工作中,也没法完全记住所有的基础细节,写这样的系列文章,可以让自己形成一个更完备的知识体系,同时给自己日后留个知识参考。开始的开始安卓四大组件中,最常用的组件莫过于我们的Activity组件。安卓程序员每天都在直接或间接地接触着Activity,所以Activity基础知识的重要性不言而喻。正文一. 正常情况下的生命周期

2021-10-26 10:59:22 9122 2

原创 实现项目组件化必经之路:解耦,再解耦!

一个组件化的项目,会将业务进行细化的拆分,通用的功能封装在通用的模块中,不同通用功能模块之间是平级的关系,不同的业务模块会按需依赖其中几个通用模块。如上图所示,业务A无法调用业务B中的API,同样业务B也无法打开业务A中的页面,这两个业务模块是独立的,通用模块之间也是如此。模块间如果需要访问API,得建立强依赖关系,项目的耦合度会变得非常高,通用模块因为需要多种依赖而失去了它通用的特性。因此我们需要一种松耦合的方式,建立平级模块间的通信方式,实现组件化。模块间需要通信的场景有很多种,例如访问页面,

2021-09-08 22:26:12 988

原创 设置页布局神器!有了它,开发设置页简直是享受

背景故事最近写到一个设置页的需求,里面加起来有十多项设置,每一项设置都有相应的业务逻辑。刚开始,我说成,设置页嘛,简单,新建个布局文件,编写一个个layout,后来发现有很多设置项布局是一样的,可以直接复制之前的,但复制多几遍后,我感觉不对劲,这些View都是一样的,我感觉一直在写重复的代码。不止如此,在代码进行数据初始化时,还需要给每个设置项定义id,然后通过id获取到各个不同的设置项,再进行相应的赋值操作。比如,我们要为每个设置项定义点击事件:如果只是定义点击事件还好,如果还涉及设置项的显示和

2021-08-06 00:35:46 143

原创 Flutter运行过程(二):Flutter如何渲染第一帧

本系列将从Flutter框架runApp()运行开始,结合框架源码,分析flutter UI渲染、更新机制,布局、绘制过程,以及解析flutter主要的生命周期过程。认真读完本系列,读者一定会对Flutter运行过程了如指掌、胸有成竹。本系列将有小量源码出没,建议读者打开编译器,配合框架源码食用,效果更佳。 开始的开始前文提到,Flutter通过注册VSync信号监听,来更新”脏“元素,那Flutter是如何显示第一帧的呢?也需要等待VSync信号回调吗?本文主要介绍Flutter渲染第一帧时.

2021-07-19 17:15:05 1364

原创 Flutter运行过程(一):一文搞懂Widget更新机制

Flutter运行过程(一):一文搞懂Widget更新机制本系列将从Flutter框架runApp()运行开始,结合框架源码,分析flutter UI渲染、更新机制,布局、绘制过程,以及解析flutter主要的生命周期过程。认真读完本系列,读者一定会对Flutter运行过程了如指掌、胸有成竹。本系列将有小量源码出没,建议读者打开编译器,配合框架源码食用,效果更佳。 开始的开始本文主要介绍Flutter的更新机制,为了更好地理解Flutter的更新过程,首先得知道操作系统是如何协调图像的绘制和显

2021-07-14 11:07:33 1464

原创 高端操作!实现RecyclerView的上下拖拽

写在前面最近工作强度好大,一天能敲10小时以上的代码,敲的我头疼。代码写多了,突然想起来,好像真的很久没发技术文了,原因有很多,就不说了。。都是借口,今天分享内容也是工作时遇上的一个小需求,觉得挺有意思,那就写篇文章吧! 需求描述大概是这样,一个页面有一个列表,列表里有很多item,需要支持用户拖拽其中item到不同的位置,来对列表项进行重新排序。要实现的效果大概如下:除去与业务相关的部分,我们只需关注如何让列表item支持上下拖拽就行,这也是这个需求的关键。我们组安卓岗在半年前已经全部用k

2021-07-01 15:42:56 2271

原创 路漫漫其修远兮,吾将上下而求索

很久没写技术文了,本来之前打算写一篇性能优化的文章,想从布局优化入手,提前想好了点子,按照自己对于一些布局的认识和思路去做了Demo,甚至还好好的去读了一遍源码。不看源码还好,看完后我就傻掉了,发现自己之前对于一些布局的运行原理有误解,源码并不是这么跑的。我的Demo里所谓的布局优化,对性能其实并没有实质的提升,这就尴尬了,本来还想写篇文章的,一下没了思路。最后还是决定等遇上了更多布局优化的场景后,再来考虑写这篇文章吧。后来又去折腾了一下毕设,打了打游戏,这一下把我写技术文的欲望给消磨没了。不写技术文

2021-06-29 23:53:00 228 1

原创 理解TextView三部曲之番外篇:或许这会是最终的进化

额,为什么会有番外篇呢。。因为新版本上线后,别的同学用我的这个控件,描边显示出问题了-_-!什么问题呢?我把问题抽出来,同时把问题放大点,给大家看看(抹眼泪.png) 好嘛,问题不大。。就是描边歪了一点点,对吧。可是怎么会这样!?,我自己测根本就没有问题,压根就没出现过这样的问题啊。。(抹眼泪.png)我又去检查了一遍计算描边位置那块的代码,最初是以为其他同学一不小心该了那块的代码,导致描边位置计算出错了,结果发现,代码丝毫没有动过的痕迹。那怎么会描边出错呢?而且他描边出问题的地方,在我这里

2021-01-26 22:00:40 221

原创 LRUCache最最zhui易懂的解析,你还不来看看?

最近在研究图片加载框架Glide,里面的代码真是非常复杂,它包括了网络请求,图片缓存、异步回调,线程池还有对图片的处理等等的内容,其中图片缓存机制用到了LRUCache和弱引用结合的方式来构建。 LRU算法大家都知道吧,它会丢弃最近,最少使用的项目,从而保留使用频率高的项目,达到一定的使用优化效果。那么LRUCache,因为其特性,特别适合在安卓中来决策图片的缓存策略,避免OOM。 在此之前我对LRUCache只有大概的了解,知道其特性,但其内部原理我却没有深入了解过,所以今天就让我们好好看看LRU

2020-12-28 15:20:48 567

原创 随心所欲!做一个你自己的号码检查控件~

最近项目有个需求,需要有一个弹窗验证手机号的中间四位,大概长这样:就是一个简单的校验手机号的控件,原以为项目中以前应该也有做过,会有现成的可以用。结果找了半天,没有~,好吧,再想想之前自己体验过的类似的控件,好像实现起来也比较简单,那就自己做一个吧。先做个简单的版本,能完成需求就行,这也是这一篇的主要内容。首先分析一下布局,上面一个TextView,下面四个文字框,底部的两个Button先不考虑。主要是这四个文字框要怎么实现?我们想要实现的效果是用户每输入一个数字,就会依次填充在对应的框框里,

2020-11-04 20:58:00 196

原创 理解TextView三部曲(三):倔强的StrokeTextView(我无论如何都要展示出来!)

理解TextView三部曲(三):倔强的StrokeTextView(我无论如何都要展示出来!而且要美美的!)上一篇我们让StrokeTextView支持padding描边,如果有同学没有看过或者对上一篇内容有遗忘的,可以移步上一篇 理解TextView三部曲(二):支持Padding的StrokeTextView 按照惯例,在本篇开头会抛出上一篇优化后的不足,看看是哪里还有问题首先看第一张图,宽、高都是wrap_content的情况下,“18”左边的描边显示正常,但是右边的描边显然就被切了一块,

2020-09-09 21:10:35 872 4

原创 理解TextView三部曲(二):支持Padding的StrokeTextView

理解TextView三部曲(二):支持Padding的StrokeTextView上一篇,我们实现了一个基本的StrokeTextView,能支持各种Gravity,本篇,我们就要在上一篇的基础上进一步优化,让StrokeTextView可以支持各种Padding,而它的margin我们不需要关心,因为margin是由父容器控制的。如果有同学不记得上一篇的内容,或者是新同学还没看过我的三部曲序列,可以点击下面的传送门阅读~:理解TextView三部曲概览理解TextView三部曲(一):Text

2020-09-06 21:06:23 425

原创 理解TextView三部曲(一):TextView的文本绘制过程

在概览中,我们已经介绍过了安卓的文本是如何绘制的,这部分是前导知识,如果有同学还对此有疑惑的,可以返回上一篇概览阅读。本篇,我们就要利用我们上一篇所学的文本绘制知识来实现一个简单的StrokeTextView,还记得要实现的效果图吗? 要实现的目标就是能够让StrokeTextView在不同Gravity的情况下,正确给文本描边我们知道要自定义View,有4种方式:继承自View继承自ViewGroup继承自特定的View,如TextView继承自特定的ViewGroup,如FrameL

2020-09-03 22:42:13 765

原创 理解TextView三部曲概览

最近项目中用到一个StrokeTextView的组件,主要是给文本内容添加描边的效果,从开始可以“描边”满足需求,到最后一步步优化成一个成熟的控件,StrokeTextView就像从一块地基变成了我想要的一栋大别墅,真是有辛酸有喜悦。这一次的优化,也是让我对TextView的绘制有了更加深刻的理解,这里总结成三部曲来记录完整的从开发到优化的过程,相信读者看完后也会对TextView的绘制有了更进一步的理解和把握。先来看看三部曲所分别要达到的效果:三部曲(一):上面这张是当width = 20dp.

2020-09-02 23:19:13 358

原创 RecyclerView实现上拉加载更多的正确姿势

最近项目上的需求需要实现下拉刷新和上拉加载更多的功能,RecyclerView下拉刷新我相信安卓的同学都会做,无非是利用SwipeRefreshLayout,然后给swipeRefreshLayout设置刷新监听,非常简单,所以这里不作赘述。上拉加载更多,除了必要的逻辑,还需要自己控制loadingView的显示与隐藏,ListView中有一个方法addFooterView()可以轻松实现,在需要显示loadingView的时候设置view的可见性即可。而RecyclerView中没有相应的方法,因此还

2020-08-18 23:26:10 7407 5

原创 ViewPager两大弊端优化方案

ViewPager两大弊端优化方案对viewpager熟悉的同学都知道,viewpager有2个弊端:一是不能关闭预加载,二是PageAdapter.notifyDataSetChanged()无效问题其中第一个弊端,不能关闭预加载相信很多人都知道原因了,所以这里不在进行解释,直接将源码放出来估计也能看得懂:private static final int DEFAULT_OFFSCREEN_PAGES = 1;public void setOffscreenPageLimit(int limit

2020-08-07 10:07:36 733

原创 2020腾讯春招安卓客户端面经(IEG)

在我PCG面凉了之后的第四天,也就是6.8号,我收到了IEG部门面试官的面试邀请,从那以后…我尽量把我的面试过程都详细的分享出来,给大家留个参考先整理一些我这次面试的时间线:6-8号预约的初试,6.9号一面,时长近40分钟6.11号官网更新面试状态,进入复试,6.12号预约的14号复试,6.14号复试,复试时长27分钟6.15号官网更新面试状态,进入HR面,未预约面试时间,6.17号上午11点HR小姐姐突击面试,时长27分钟6.17号上午12点左右官网显示面试状态已完成6.19号,上午10.

2020-06-19 18:10:47 1496 3

原创 2020春招腾讯安卓客户端面经(PCG)

2020春招腾讯安卓客户端面经(PCG)本来原计划是这个春季多准备下面试,准备7月份左右的秋招,然后从三月份开始刷leetcode的算法题,一天1-2两道题目,准备稳扎稳打的来。一连准备到了4月多,力扣也刷了接近100道。这时看着我的其他同学都已经搭上了春招的快车,都已经进入了各自的面试状态,再加上一位高中好友的怂恿,我忍不住了,也从4月开始了我的春招之路,美团、京东、腾讯啥的都投了一遍,最先给我面试的腾讯,也就是下文要介绍的,因为是大学第一次实习面试,所以即使在牛经Buff的加持下,我依然没有把握住这

2020-06-18 22:24:33 840

原创 源码分析Android的消息机制

一、引言​ Android消息机制主要指的是Handler的运行机制,是一块很有意思,也很有研究意义的内容。本文计划在较短的篇幅内,通过一定的源码,分析Android消息机制,并在结尾说点”题外话“,帮助我们理解消息机制在安卓应用中的作用。二、Android消息队列与四大组件的关系​ Android的消息机制伴随着安卓四大组件的生命周期,Activity启动,Service绑...

2020-05-07 23:36:17 470 1

原创 Binder工作过程和源码解析

一. 前言Binder是个很深入的话题,上到应用层,下到linux kernel底层,都能见到Binder的身影。要想用一篇文章对整个Binder的原理叙述清楚,是不可能的。本文从应用层的角度出发,为大家剖析Binder的工作过程。为了避免深入代码细节无法自拔,本文的源码解析也是点到为止,从一个整体上,让大家对Binder有更进一步的理解。二. 什么是Binder?直观来说,Binder是A...

2020-04-03 18:13:47 357

原创 我们需要了解的https协议:https如何确保数据传输的安全?

这段时间在家真是太闷了,新的笔记本也是最近才到,终于可以干活了,不过新的电脑还要下载软件环境、配置等等。趁着这等待的时间,我去学习了下https协议的知识,这里整理出来,和大家分享一下。了解https到底是如何确保数据传输的安全,有助于我们更好的理解并解决开发中遇到的实际问题,同时也是面试时面试官经常会问到的一块知识。在正式开始介绍前,我们需要先知道两个概念:对称加密和非对称加密;对称加...

2020-03-08 23:19:48 886 2

空空如也

空空如也

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

TA关注的人

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