卧薪尝胆三个月啃透Android面试全秘籍,现已入职字节跳动,税前30K

卧薪尝胆三个月啃透Android面试全秘籍,现已入职字节跳动,税前30K,第1张

卧薪尝胆三个月吃透收藏腾讯技术博主整理的Android面试全秘籍后,才收到字节跳动的offer,谈到了30k的月薪顺利入职。

本来那时候就打算写一份入职感受的,结果上个月因为熟悉业务而耽误了,一直都无法抽出时间来写。最近总算是抽出空来,好好来说一说。

1、两轮远程,一轮现场,HR直接过来谈薪资

现在的工作地点是在北京,而我裸辞后是回到了老家。

前两轮都是进行的线上面试,进到了第三轮就要求去到现场参加面试了。依然记得,第三轮面试的时候,负责人面过之后,又找了两个人过来进行交叉面试,说实话,我当时还蛮紧张的。

不过,好在第三面完后,也许是三个负责人都比较满意,HR就来跟我谈薪资了。最后定在了30K14。

2、我记下的面试题

字节跳动一面(电话面)

自我介绍+说说自己做过项目的技术核心,你在项目中遇到最难得点是什么?如何解决的?

Activity 到底是如何启动的?启动模式以及使用场景

Handler了解吗?Handler Looper Message 关系是什么?Messagequeue 的数据结构是什么?为什么要用这个数据结构?

如何在子线程中创建 HandlerHandler post 方法原理?

Fragment 之间如何进行通信?Fragment的生命周期?Fragment 生命周期和 Activity 对比

Service的运行线程(生命周期方法全部在主线程)、进程保活

ViewStub、include、merge原理是什么?什么时候使用它?

AsyncTask是串行还是并行执行?

dispatchTouchEvent, onTouchEvent, onInterceptTouchEvent 方法顺序以及使用场景 滑动冲突,如何解决(这好像是二面的问题,又好像是一面的问题,不是很确定就写在一面)

字节跳动二面(视频面)

项目介绍

如何进行自定义 View,以及view 重绘机制

为什么Android要用 binder 进行跨进程传输,多进程那些带来的问题

AMS,WMS,PMS 创建过程

为什么会发生 ANR?如何定位 ANR?如何避免 ANR?

内存泄漏和内存溢出的原理,什么情况下会内存泄漏?如何防止内存泄漏?

LruCache使用极其原理

如何进行 内存 cpu 耗电 的定位以及优化?性能优化经常使用的方法?如何避免 UI 卡顿?

MVC、MVP、MVVM的优劣点?

Gradle自定义插件的方式?

字节跳动交叉面

项目介绍

Android现在流行的屏幕适配方式

RxJava的原理、特点和使用过程?

Retrofit的使用流程和机制

从源码的角度,说说Glide的执行流程

组件化、插件化和热修复的原理,为什么要用组件化?组件之间如何通信?组件之间如何跳转?

你是负责一款APP的那部分的模块开发?你最近做的 APP 是如何架构的?为什么要这样架构?平时遇到问题了是如何解决的?

平时怎么进行技术进阶,如何学习?现在你觉得自己处于什么技术水平?你的技术优势是什么?

总之,对哪一块比较熟悉大胆的说就行了,面试官不会太为难你,只有你明确了你掌握的技术点,面试官才会深入继续问。

面试官不是想为难你,而是需要知道你到底掌握了哪些技术,广度和深度是怎样的。然后再匹配这边的岗位需求,进行考察。

2022最新Android中高级面试题合集

第一章 Java 方面

(一)Java 基础部分

(二)Java 集合

(三)Java 多线程

(四)Java 虚拟机

第二章 Android 方面

(一)Android 四大组件相关

(二)Android 异步任务和消息机制

(三)Android UI 绘制相关

(四)Android 性能调优相关

(五)Android 中的 IPC

(六)Android 系统 SDK 相关

(七)第三方框架分析

(八)综合技术

(九)数据结构方面

(十)设计模式

(十一)计算机网络方面

(十二)Kotlin方面

篇幅有限,无法展示全部资料, 《2022最新Android中高级面试题合集》 完整版(面试题+答案解析)免费分享,希望可以帮助大家在这凛冽的" 寒冬 "里,砥砺前行 !感谢阅读~

glide [ɡlaid] n 滑翔;滑行;滑移;滑音vt 滑翔;滑行;悄悄地走;消逝vi 使滑行;使滑动[ 过去式glided 过去分词glided 现在分词gliding ] 网络释义21世纪大英汉词典英英释义 -glide: 滑翔;滑移;滑步;滑音 滑翔 争(WBR): 不用多说,对应的军方武器升到全满是必须的 限制你使用特定的武器,时限内清掉指定的目标,杀越多越好 滑翔(GLIDE): 自然是跑去中立区辗贱基于68个网页 - 搜索相关网页 滑移 机械专业词汇-G1 glidevector滑动矢量glide滑移glider滑翔 基于62个网页 - 搜索相关网页 滑步 奥运会花样滑冰四个项目 滑脚 employed foot;gliding foot;tracting foot 滑步 glide 滑弧线 curved stroke 基于52个网页 - 搜索相关网页 滑音 格的另一组声音群组,声音在On-glide后,可以有一段持续的时间,然后再到off-glide,由于时间可以持续,也使得元音和滑音(Glide)有所不同。元音的分类方式,依照唇型,舌的纵向高低,和矢向前后等方式做分类。基于49个网页 - 搜索相关网页 -glide lamella: 滑移层;滑动夹层;滑动夹层,滑移层 滑移层 全球机床网 glide direction 滑移方向 glide lamella 滑移层 glide path 下滑航迹 基于72个网页 - 搜索相关网页 滑动夹层 词博科技英语[科技词汇[211001-212000 glide fold 剪切褶曲glide lamella 滑动夹层; 滑移层glide line 滑移线 基于1个网页 - 搜索相关网页 滑动夹层,滑移层 英汉日科技词汇——G glide fold ==> 剪切褶曲 glide lamella ==> 滑动夹层,滑移层 glide line ==> 滑移线 基于1个网页 - 搜索相关网页 -glide vector: 滑动矢量 滑动矢量 机械工程学专业英语词汇(G)—生命经纬 glide step 滑移台阶glide vector 滑动矢量glider 滑翔机 基于53个网页 - 搜索相关网页 -glide step: 滑移台阶 滑移台阶 机械工程学专业词汇英语翻译(G) glide plane 滑移面 glide step 滑移台阶 glide vector 滑动矢量 基于49个网页 - 搜索相关网页 -onset glide: 成阻滑音 成阻滑音 English/Chinese Linguisti on-glide 成阻;起音 onset glide 成阻滑音 Idiom Neutral 成型中立语〔一九O三年创立的人造语〕 基于16个网页 - 搜索相关网页 -offset glide: 除阻滑音 除阻滑音 English/Chinese Linguisti off-glide 除阻;附属元音;收音;后流 offset glide 除阻滑音 Magyar 马扎儿语;匈牙利语 基于14个网页 - 搜索相关网页 -final glide: 除阻 除阻 English/Chinese Linguisti Semitic 闪语 final glide 除阻 off-glide 除阻;附属元音;收音;后流 基于11个网页 - 搜索相关网页 -glide bomb: 滑翔炸d;滑翔式炸d 滑翔炸d 航空军事学词汇台湾翻译(9) glide angle 下滑角glide bomb 滑翔炸dglide; distance of 下滑距离 基于10个网页 - 搜索相关网页 滑翔式炸d 机械英汉词典(G) glide band || 滑移带 glide bomb || 滑翔式炸d glide conveyor || 滚动式输送机 基于1个网页 - 搜索相关网页 -glide landing: 无拉平着陆;下滑降落 无拉平着陆 谁看过这篇博文 熟练着陆 perfect landing 无拉平着陆 glide landing 降落 alighting 基于4个网页 - 搜索相关网页 下滑降落 翻译资源百分百[>

对于这个情况,第一时间想到的方法,就是imageview增加scaleType="centerCrop"。

imageview自带的centerCrop是不管小于还是大于imageview的大小,都会等比例拉伸填充满,然后裁剪;

另外,如果加载框使用的是glide,那么glide自己也有一个centerCrop,但是跟imageview自带的不一样。

Glide的centerCrop对于大图是裁剪,如果小于imageview,则是等比例全部显示在imageview里而不是填满裁剪;

注意: 如果imageview自己设置了centeCrop,这时候Glide再设置圆角,如果原图小于imageview,圆角是无效的。

这是因为glide先处理了数据,同时由于是小于imageview的大小的,所以glide的处理是全部显示在imageview上,然后处理圆角。最后把处理完的数据(有圆角),设置在imageview上,由于imageview有centerCrop属性,会等比例拉伸填充裁剪,导致了圆角的失效。

imageview同时设置fitXY 和adjustViewBounds 也能达到效果。

fitXY 这种的显示方式的效果是:根据 ImageView 设置的大小拉伸以填充满空间,(单独设置此属性时)会变形。

adjustViewBounds 是限制在显示时保持原图比例。(和 fitXY 显示方式合用能到达自适应的效果)

①自定义view,继承iamgeview,重写onMeasure

但是如果利用glide来加载,又会发现,上面的方法也是不行的,因为glide是根据imageview的大小来加载的,由于上面设置的是warp_content,所以glide无法准确根据大小来加载。

解决方法:

1、你已经知道(或其他方式提前知道)的比例,然后在用 Glide 请求时限制的加载大小,即设置 override(int width, int height) 。这时候加载到的是原图比例,显示的时候虽然有拉伸/压缩但都会保存原比例的。这种方式适用于你加载的大小都比较规范固定的时候。

2、当你请求的源大小不一定一致。那这时候就可以使用下面这种方式了。这种方式的原理是,先使用 Glide 把的原图请求加载过来,然后再按原图来显示。

这两种方法中,其实更加提倡的是第一种方式,因为这种方式不会造成任何负面的影响。但第二种方式,由于Glide加载时是以全分辨率加载的,当加载过大且很多时,可能造成 OOM。同时第二种方式使用在列表上复用时会造成条目错乱错位。

其实也简单,也是需要自定义view。

①自定义view,重写ondraw方法。

②获得将要显示的的尺寸或者比例,传入自定义view中,备用。

③onMeasure可以获得控件的大小,记录下来。

④在ondraw方法里,根据控件的大小和的大小,利用canvas先把从左上角开始填充。

⑤记录填充后的位置,如果还小于控件的大小,那就继续接着填充同样的bitmap,直到填满为止。

Event触发的时机:

而在androidxactivityComponentActivity和androidxcoreappComponentActivity中,该方法的实现,其实都是一样的。

但是这两个Activity,其实都有自己的mLifecycleRegistry对象。

LifecycleRegistry对象其实可以理解为观察者模式中的Observable,也就是被观察者,而LifecycleRegistry对象的创建,其实是传入一个LifecycleOwner实现类对象,而androidxactivityComponentActivity和androidxcoreappComponentActivity实现了LifecycleOwner接口,所以传入的是this。

LifecycleRegistry中聚合了多个LifecycleObserver,生命周期改变时,通知LifecycleObserver进行相应方法的调用。

在LifecycleRegistry类中的addObserver方法中,其实就是通过封装LifecycleObserver生成了一个ObserverWithState对象,然后放入FastSafeIterableMap中,而FastSafeIterableMap其实就是一个自定义列表,用于保存观察者并且可在遍历期间处理删除/添加。

其实在自定义的某个类去实现LifecycleObserver接口的时候,在activity中,是需要通过getLifecycle()addObserver()进行注册的,这个过程其实就是调用了LifecycleRegistry的addObserver()方法。

ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);会将LifecycleObserver对象封装在ReflectiveGenericLifecycleObserver对象中。但是这里的需要判断是实现了哪个接口,比如androidxactivityComponentActivity中的构造函数中,因为是直接new LifecycleEventObserver匿名内部类实现接口对象,则isLifecycleEventObserver为true,就不会new ReflectiveGenericLifecycleObserver(),而在自定义一个类的时候,一般实现LifecycleObserver接口,则就会new ReflectiveGenericLifecycleObserver()

androidxactivityComponentActivity的构造函数:这里是new LifecycleEventObserver

自定义的BasePresenter:这里是实现LifecycleObserver接口

所以上面的两种不同的实现,BasePresenter实现的是LifecycleObserver,所以这个LifecycleObserver的最终实现是ReflectiveGenericLifecycleObserver。而ComponentActivity因为是new LifecycleEventObserver,所以这个匿名内部类对象就是最终实现。

在androidxcoreappComponentActivity的onCreate方法中,会调用

这里使用ReportFragment,如果是api29以及以上的,则可以直接注册回调来获取Activity的生命周期回调。如果是api29以下的,则需要手动给Activity添加一个空白的Fragment,类似于Glide监听生命周期回调的做法。

LifecycleCallbacks的定义如上,是在ReportFragment中定义的,其实就是使用了ApplicationActivityLifecycleCallbacks来实现了。

其实就是在androidxcoreappComponentActivity中添加一个ReportFragment,而ReportFragment的生命周期方法,其实都调用了一个dispatch方法。

所以在ReportFragment的生命周期方法,其实就会通过调用对应的dispatch方法进而调用到了Activity的getLifecycle()方法获取到一个LifecycleRegistry对象,然后调用LifecycleRegistry的handleLifecycleEvent()方法。

这里需要事先获取到Activity的下一个生命周期状态,而这个状态过程其实与Fragment的类似,都是先升序,然后再降序的一个过程。即ON_CREATE是CREATED,ON_RESUME是RESUMED,然后ON_PAUSE是变成STARTED

而上面调用的sync()方法,其实其内部会调用两个方法backwardPass()和forwardPass(),一个是逆推,一个是顺推,其实就是可以认为一个是正序,一个是倒序。

比如forwardPass(),其实其内部就是遍历刚才缓存Observer的集合,找到每个Observer

而这里的dispatchEvent,其实就是ObserverWithState的方法,因为ObserverWithState内部封装了LifecycleEventObserver对象,而LifecycleEventObserver对象又是封装了LifecycleObserver对象的。

比如Activity的,其实onStateChanged是在androidxactivityComponentActivity的构造器中添加注册的LifecycleEventObserver监听接收对应的处理回调,在这里就会根据是ON_STOP还是ON_DESTROY进行回调的处理,也就是生命周期的处理。

这样的生命周期回调,在自定义类实现LifecycleObserver接口的时候,也可以采用注解的方式注册对应的LifecycleEventObserver监听,这样的生命周期的回调,其实就是回调到对应的注解和事件的方法中。这样是采用了类似于apt注解处理器的方式,生成了对应的java类

这里需要注意,如果是自定义添加监听的时候,是实现了LifecycleEventObserver,那么在分发的时候,调用ObserverWithState的dispatchEvent方法去分发,就会直接回调到了自定义LifecycleEventObserver实现类中的onStateChanged中;而如果是使用LiveData添加观察者的话,则是封装成LifecycleBoundObserver对象,然后通过其onStateChanged方法继续进一步的处理分发,调用到对应的Observer的onChanged方法进行最终的处理

如果这里的分发是分发到上面的那个自定义的BasePresenter,则需要经过ReflectiveGenericLifecycleObserver

从上面的原理解析,可以知道,Lifecycle的生命周期的感知和分发,其实也是依赖于一个ReportFragment,这其实也是一个空的Fragment,这样的做法,其实与Glide的生命周期的监听是类似的做法,都是采用一个空的Fragment来监听生命周期的变化,然后在不同的生命周期做不同的 *** 作。

一、表达意思不同

1、slip:滑倒,失足;溜走,悄悄地走;迅速放置(某物),偷偷塞;(物)滑落,脱落;滑行,打滑;变坏,下降;陷入,进入(困难或不愉快的处境);(飞机飞行中的)侧滑;(地质)滑移,滑距;瘦小的年轻人。

2、slide:(使)滑行,滑动;滑落;迅速熟练地进出;(使)快捷而悄声地移动;(价格等)下滑,下跌;逐渐败坏,开始出现问题;(棒球)滑垒;(吉他)滑奏;无后帮凉鞋(或轻便鞋)。

3、glide:滑行,滑动;滑翔;做事顺利;悄悄地走,流逝;滑音,延音;(尤指向腿侧的)斜击。

二、侧重点不同

1、slip:侧重于不自觉地、偶然地滑动。

2、slide:侧重于指与光滑表面保持接触并且迅速地连续滑动。

3、glide:侧重于自由、顺畅地流动,或者说不费力、无声响地滑动。

例句

1、Robert had slipped her a note in school

罗伯特上学时偷偷地塞给了她一张字条。

2、She had slid into a depression

她不知不觉地抑郁寡欢起来。

3、The plane managed to glide down to the runway

飞机终于成功地滑翔降落在跑道上。

以上就是关于卧薪尝胆三个月啃透Android面试全秘籍,现已入职字节跳动,税前30K全部的内容,包括:卧薪尝胆三个月啃透Android面试全秘籍,现已入职字节跳动,税前30K、单词glide都有什么意思、图片不拉伸、不改变view大小的前提下,解决空白问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9615602.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存