【Android实习】20场面试斩获大厂offer,我学会了什么
前言很高兴遇见你~
先说一下笔者春招实习的情况:从三月初到四月半,经历了近20场面试,一共面试了五家企业,通过了腾讯、字节、蚂蚁、美团的面试,虎牙在一面之后拒了二面邀请。
金三银四,笔者不是在面试中,就是在面试的路上,踩了很多坑,吃了很多亏,也学了很多的东西。这篇文章,就想要把笔者的这些收获分享给你们,希望对你们有帮助。
文章的内容总体上可以分为两个部分:吹水、干货。吹水部分主要是分析笔者的面试过程,有兴趣的读者可以看一下;干货部分主要是分享笔者的面试经验,从技术到非技术到面试表现,可以根据标题按需阅读。同时需要注意的是:文章内容均为笔者的个人经验之谈,请不要奉为圭臬,辩证看待,同时欢迎各位评论区交流。
那我们开始吧~
面试经历这部分主要是跟大家分享一下笔者的整个实习面试过程,属于纯吹水内容,且内容稍长。有兴趣的读者可以看一下,或者直接跳转到知识总结看干货。
三四月几乎各路大厂开始疯狂招聘实习生。但其实有一些大厂,如腾讯、字节,在三月前甚至年前,就已经开始接收简历了。这个时候的岗位几乎应有尽有,难度也会相对三四月低一些,是一个非常好的机会。但笔者,比较怂,感觉没有准备好,到了三月才开始 ...
写给android工程师的cookie分析
前言很高兴遇见你~
cookie在HTTP1.1版本中被添加,目的是为了解决HTTP的无状态特性,使HTTP变得“有状态”。
我们在做android开发,很多时候并不能很好理解cookie的存在价值、优化。这其实正常。Http中文翻译为超文本传输协议,是为web开发的传输协议。而cookie作为其中的一个功能,他的设计自然也是服务于web。为了更好地理解cookie他的本质,需要站在web开发的角度来理解他,具体而言就是使用浏览器网页具体化客户端。
android的发展要比web晚的多。虽然都使用cookie,但cookie相对于android并没有跟web一样有那么多的好处。但cookie也并不是完全没用,例如我们都知道cookie可以实现记住登录状态。
这篇的文章的目的在于帮助android开发者理解cookie的本质是什么,这样我们在使用cookie的时候会更加心里有底。
购物车的故事我们都知道,HTTP是一个无状态的协议。无状态体现在每一次的请求与响应都是独立的,他们之间不会互相记录、互相影响。
嗯?我们在后端不是会维护购物车的状态,提供api给客户吗?是的,可以有,我们后 ...
关于Handler同步屏障你可能不知道的问题
前言很高兴遇见你 ~
关于handler的内容,基本每个android开发者都掌握了,网络中的优秀博客也非常多,我之前也写过一篇文章,读者感兴趣可以去看看:传送门。
这篇文章主要讲Handler中的同步屏障问题,这也是面试的热门问题。很多读者觉得这一块的知识很偏,实战中并没有什么用处,仅仅用来面试,包括笔者。我在Handler机制一文中写到:其实同步屏障对于我们的日常使用的话其实是没有多大用处。因为设置同步屏障和创建异步Handler的方法都是标志为hide,说明谷歌不想要我们去使用他。
笔者在前段时间面试时被问到这个问题,之后重新思考了这个问题,发现了一些不一样的地方。结合了一些大佬的观点,发现同步屏障这个机制,并不如我们所想完全没用,而还是有他的长处。这篇文章则表达一下我对同步屏障机制的思考,希望对你有帮助。
文章主要内容是:介绍同步屏障,分析系统api,如何正确使用他。
那么,我们开始吧。
什么是同步屏障机制同步屏障机制是一套为了让某些特殊的消息得以更快被执行的机制。
注意这里我在同步屏障之后加上了机制二字,原因是单纯的同步屏障并不起作用,他需要和其他的Handler组件配合才能 ...
通俗易懂,android是如何管理内存的
前言很高兴遇见你~
内存优化一直是 Android 开发中的一个非常重要的话题,他直接影响着我们 app 的性能表现。但这个话题涉及到的内容很广且都偏向底层,让很多开发者望而却步。同时,内存优化更加偏向于“经验知识”,需要在实际项目中去应用来学习。
因而本文并不想深入到底层去讲内存优化的原理,而是着眼于宏观,聊聊 android 是如何分配和管理内存、在内存不足的时候系统会如何处理以及会对用户造成什么样的影响。
Android 应用基于 JVM 语言进行开发,虽然 google 根据移动设备特点开发了自家的虚拟机如 Dalvik、ART,但依旧是基于 JVM 模型,在堆区分配对象内存。因此 Java heap(java 堆)是android应用内存分配和回收的重点。其次,移动设备的 RAM 非常有限,如何为进程分配以及管理内存也是重中之重。
文章的主要内容是分析 Java heap、RAM 的内存管理,以及当内存不够时 android 会如何处理。
那么,我们开始吧。
Java HeapJava Heap,也就是 JVM 中的堆区。简单回顾一下 JVM 中运行时数据区域的划分:
...
清晰图解深度分析HTTPS原理
前言很高兴遇见你~
Https现在基本已经覆盖所有的http请求了,作为一个伟大的发明,保障了我们的通信安全。在Android中对于HTTPS其实感知不多,因为这些内容都有成熟的框架帮我们完成了,例如okHttp。我们发起一个http或https的请求几乎感受不到区别。
但最近在研究okHttp的源码的时候,发现很多的内容没看懂,最后发现是http相关的网络知识不扎实,再一次回过头来,把https学了一遍。正如前面所说,得益于框架,我们几乎不需要学习https背后到底发生了什么,但是发生了相关的bug也就无法修复(面试要问[狗头])。所以,作为一个android开发者,也还是很有必要学一下https。
HTTPS的目标就是解决网络通信的安全问题。本文首先阐述网络中存在的风险,然后再讨论其涉及的加密方法、证书验证,最后再同从请求的角度解析整个安全连接的流程。
网络存在的风险在没有经过任何加密手段的HTTP通信中,面临着三大危险:消息监听、消息篡改、冒充身份 。
消息监听我们发送的消息需要经过很多的中间路由器,我们无法确保网络中每一个节点都是安全的,所以我们发送的数据会被恶意的对象截取到。 ...
这一篇TCP总结请收下
前言很高兴遇见你~
TCP这些东西,基本每个程序猿都或多或少是掌握的了。虽然感觉在实际开发中没有什么用武之处,但,面试他要问啊
而最近大家伙过完年,也都在准备春招,我也一样。阅读了一些okHttp源码之后,又屁颠屁颠地跑回来重新把tcp、http这些东西给重新学了一遍。okHttp基本都是这些协议的实现,而理解源码的基础是,理解tcp、http。
重新看了一遍tcp之后,我把这些东西给总结了下来,也就有了这篇文章。
计算机网络的知识特点就是:琐碎。靠背诵“面试八股文”估计没多久就忘了。TCP是计算机网络运输层的一个协议,所以首先要对计网分层结构以及运输层有一定的理解。然后是TCP的四个重点:面向连接、可靠传输原理、流量控制和拥塞控制,最后再补充一点粘包和拆包的知识。
计网分层结构考虑最简单的情况:两台主机之间的通信。这个时候只需要一条网线把两者连起来,规定好彼此的硬件接口,如都用USB、电压10v、频率2.4GHz等,这一层就是物理层,这些规定就是物理层协议 。
我们当然不满足于只有两台电脑连接,因此我们可以使用交换机把多个电脑连接起来,如下图:
这样连接起来的网络,称为局域网 ...
2020年度总结
元旦那会,看了很多朋友的年终总结。有取得非常优秀的成绩的,也有被2020按在地上摩擦的。2020确实是很特殊的一年,这一年发生了非常多的变化,唯一不变的是,大家都成长了非常多。
对于我来说,一年的始终,以春节为起点,除夕为终点。所以,在除夕到来之前,回顾一下这一年我到底经历了什么,失去了什么,又获得了什么。
2020春节前,疫情开始大爆发,从而整个正月,都取消了所有的过年活动。对于我来说,其实没有很大的不同。我家一直处于低风险地区,整个市也仅有几例。虽然人心惶惶,但是对于我这个死宅来说,只是多了一个宅家的理由罢了。
在2020的前几个月,每天睡到12点,打会游戏,继续睡到下午4、5点,起来吃个饭,然后就打游戏到晚上3、4点。如此循环,其他的不知道,但是时间过得是非常快。转眼间学校开始了线上授课,我也结束了我那个浑浑噩噩的日子。这个转折点还有一个重要的东西:我突然喜欢上阅读了。
由于打游戏到无聊了,B站在疫情期间开始用力出圈,其中有两个up主迅速出圈,他们是:半佛、罗翔。在当初,每次看他们的视频,都能让自己的认知得到了启发。虽然在半佛的一个荐书视频中,我看了他推荐的5本书。认知又突然受 ...
深入浅出Java线程池:源码篇
前言在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用。(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适)。本文则深入线程池的源码,主要是介绍ThreadPoolExecutor内部的源码是如何实现的,对ThreadPoolExecutor有一个更加清晰的认识。
ThreadPoolExecutor的源码相对而言比较好理解,没有特别难以读懂的地方。相信没有阅读源码习惯的读者,跟着本文,也可以很轻松地读懂ThreadPoolExecutor的核心源码逻辑。
本文源码jdk版本为8,该类版本为jdk1.5,也就是在1.5之后,ThreadPoolExecutor的源码没有做修改。
线程池家族Java中的线程池继承结构如下图:(类图中只写了部分方法且省略参数)
顶层接口Executor表示一个执行器,他只有一个接口:execute() ,表示可以执行任务
ExecutorService在Executor的基础上拓展了更多的执行方法,如submit() shutdown() 等等,表示一个任务执行服务。
AbstarctExecutorSe ...
深入浅出Java线程池:理论篇
前言很高兴遇见你~
借助于很多强大的框架,现在我们已经很少直接去管理线程,框架的内部都会为我们自动维护一个线程池。例如我们使用最多的okHttp以及他的封装框架Retrofit,线程封装框架RxJava和kotlin协程等等。为了更好地使用这些框架,则必须了解他的实现原理,而了解他的原理,线程池是永远绕不开的话题。
线程的创建与切换的成本是比较昂贵的。JVM的线程实现使用的是轻量级进程,也就是一个线程对应一个cpu核心。因此在创建与切换线程时,则会涉及到系统调用,是开销比较大的过程。为了解决这个问题,线程池诞生了。
与很多连接池,如sql连接池、http连接池的思想类似,线程池的出现是为了复用线程,减少创建和切换线程所带来的开销,同时可以更方便地管理线程。线程池的内部维护有一定数量的线程,这些线程就像一个个的“工人”,我们只需要向线程池提交任务,那么这些任务就会被自动分配到这些“工人”,也就是线程去执行。
线程池的好处:
减少资源损耗。重用线程、控制线程数量,减少线程创建和切换所带来的开销。
提高响应速度。可直接使用线程池中空闲的线程而不必等待线程的创建。
方便管理线程。线程池可以 ...
Android事件分发机制五:面试官你坐啊
前言很高兴遇见你~
事件分发系列文章已经到最后一篇了,先来回顾一下前面四篇,也当个目录:
Android事件分发机制一:事件是如何到达activity的? : 从window机制出发分析了事件分发的整体流程,以及事件分发的真正起点
Android事件分发机制二:viewGroup与view对事件的处理 : 源码分析了viewGroup和view是如何分发事件的
Android事件分发机制三:事件分发工作流程 : 分析了触摸事件在控件树中的分发流程模型
Android事件分发机制四:学了事件分发有什么用? : 从实战的角度剖析事件分发的运用
本文是最后一篇,主要是模拟面试情况提出一些问题以及解答,也当是整个事件分发知识的回顾。读者也可以尝试一下看看这些问题是否都能解答出来。
面试开始
学过事件分发吗,聊聊什么是事件分发
事件分发是将屏幕触控信息分发给控件树的一个套机制。当我们触摸屏幕时,会产生一些列的MotionEvent事件对象,经过控件树的管理者ViewRootImpl,调用view的dispatchPointerEvnet方法进行分发。
那主要的分发流程是什么:
在 ...
Android事件分发机制四:学了事件分发有什么用?
“ 学了事件分发,影响我CV大法吗?”“ 影响我陪女朋友的时间”“ ….. ”
前言Android事件分发机制已经来到第四篇了,在前三篇中:
Android事件分发机制一:事件是如何到达activity的? : 从window机制出发分析了事件分发的整体流程,以及事件分发的真正起点
Android事件分发机制二:viewGroup与view对事件的处理 : 源码分析了viewGroup和view是如何分发事件的
Android事件分发机制三:事件分发工作流程 : 分析了触摸事件在控件树中的分发流程模型
那么关于事件分发的知识在上面三篇文章也就分析地差不多了,接下来就分析一下学了之后该如何使运用到实际开发中,简单阐述一下笔者的思考。
Android中的view一般由两个重要的部分组成:绘制和触摸反馈。如何精准地针对用户的操作给出正确的反馈,是我们学事件分发最重要的目标。
运用事件分发一般有两个场景:给view设置监听器和自定义view。接下来就针对这两方面展开分析,最后再给出笔者的一些思考与总结。
监听器触摸事件监听器可以说是我们接触Android事件体系的第一步。监听器通常有: ...
Android事件分发机制三:事件分发工作流程
前言很高兴遇见你~
本文是事件分发系列的第三篇。
在前两篇文章中,Android事件分发机制一:事件是如何到达activity的? 分析了事件分发的真正起点:viewRootImpl,Activity只是其中的一个环节;Android事件分发机制二:viewGroup与view对事件的处理 源码解析了viewGroup和view是如何分发事件的。
事件分发的核心内容,则为viewGroup和view对事件的分发,也就是第二篇文章。第二篇文章对源码的分析较为深入,缺乏一个更高的角度来审视事件分发流程。本文在前面的分析基础上,对整个事件分发的工作流程进行一个总结,更好地把握事件是如何在不同的对象和方法之间进行传递。
回顾先来回顾一下整体的流程,以便更好地定位我们的知识。
触摸信息从手机触摸屏幕时产生,通过IMS和WMS发送到viewRootImpl
viewRootImpl通过调用view的dispatchPointerEvent方法把触摸信息传递给view
view通过调用自身的dispatchTouchEvent方法开始了事件分发
图中的view指的是一个控件树,他可以是一个vi ...