写点什么

你知道 Android 面试官最喜欢问那些技术点嘛?这篇带你复盘往年面试题!

发布于: 2021 年 11 月 07 日

下图是 Activity 状态转换图(注意图中,方框内执行的是状态转换的过程,并不是状态,状态如前述,只有三种:RUNNING / PAUSED / STOPPED。)



3、简述一下 RecyclerView 缓存机制?


RecyclerView 在 Android 的应用上可以说已经取代了 listview,其灵活,组装式设置,多缓存机制可以适应多列表在 Android 开发中各种各样的需求。


对于 RecyclerView 的缓存机制一直都想稍微的屡下思路,简单点说 RecyclerView 对比 listview 缓存机制中就是多了两层缓存的支持,listview 是两级缓存,RecyclerView 为四级缓存(当然在大部分情况下是三级缓存)。


4、在一个 listview 里每个 item 中都有一个动画(gif)播放的 view,当我点击 item 中的 button 时动画(gif)播放。当有动画播放时滑动 listview,偶尔会发生 item 错位的事件。原因是什么?


这是 item 复用的问题,由于异步加载导致图片错位


5、当 Activity 有多个 Handler 的时候,Message 消息是否会混乱?怎么样区分当前消息由哪个 Handler 处理?


不会混乱,哪个 Handler 发送的消息,到时候也是这个 handler 处理。在发送消息的时候,会绑定 target,这个 target 就是 Handler 本身,当需要 handler 调用 dispatchMessage(msg)处理消息的时候,这个 Handler 就是发送消息时绑定的 handler。


无论用哪一种方法发送消息,最终都会调用 enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis)来发送消息


private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {


msg.target = this;


if (mAsynchronous) {


msg.setAsynchronous(true);


}


return queue.enqueueMessage(msg, uptimeMillis);


}


这里的 this,就是当前的 handler。在来看需要 Handler 处理消息的时候,取的是哪一个 handler,下面贴出主要源码。?


public static void loop() {


......


for (;;) {


Message msg = queue.next(); // might block


if (msg == null) {


// No message indicates that the message queue is quitting.


return;


}


// This must be in a local variable, in case a UI event sets the logger


......


if (traceTag != 0 && Trace.isTagEnabled(traceTag)) {


Trace.traceBegin(traceTag, msg.target.getTraceName(msg));


}


final long dispatchStart = needStartTime ? SystemClock.uptimeMillis() : 0;


final long d


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


ispatchEnd;


try {


msg.target.dispatchMessage(msg);


dispatchEnd = needEndTime ? SystemClock.uptimeMillis() : 0;


} finally {


if (traceTag != 0) {


Trace.traceEnd(traceTag);


}


}


......


msg.recycleUnchecked();


}


}


这是循环消息时的部分代码,处理消息代码是 msg.target.dispatchMessage(msg);,这里的 target 就是当时发送消息的 handler。


二、网易(2020.5.2 面试)




1、介绍项目


刚刚说了,不多介绍


2、说一下你对 Java 中强引用、弱引用、软引用的理解


强引用:这种引用就是我们在平常频繁使用的引用类型,JVM 默认的就是这种引用类型的,例如,A a = new A(),这种就是强引用;


在这种类型下,当内存空间不足的时候,JVM 宁可会 OOM,使得程序异常中止退出,也不会随意的对其进行回收,只有当此对象没有引用的时候,JVM 才会回收他。


软引用:这种引用我们可以这样使用它,SoftReference sr = new SoftReference(new A());可以利用 sr.get()获取到这个对象,这种引用类型的对象,如果 JVM 内存足够的话就不会回收他;如果 JVM 内存不足了,才会回收这些对象。这种引用类型适合用作缓存来使用。


弱引用:这种引用可以这用使用他,WeakReference wr = new WeakReference(new A());然后利用 wr.get()获取到这个对象;这种引用类型的对象,比软引用的对象,拥有更加短暂的生命周期,在垃圾收集器扫描 JVM 的内存区域的时候,遇到此种引用类型的对象的时候,不管当前内存是否够用,都会回收这些对象。


3、死锁是什么?必要条件是什么?怎么避免?


  • 死锁是指多个进程循环等待它方占有的资源而无限期僵持下去的局面。当两个或两个以上的进程同时对多个互斥资源提出使用要求时,有可能导致死锁。

  • 互斥条件:即一次只有一个进程可以使用资源,其它进程不能访问已经分配给其它进程的资源

  • 占有且等待:一个进程等待其它进程释放资源的时候,它已知占有这个资源

  • 不可抢占:其它进程不能强行占用已经分配给进程的资源

  • 循环等待:存在一个闭合链,链中的进程至少占据链中下一个进程的所需的一个资源


死锁避免:


  • 预防互斥:不可能禁止

  • 预防占有且等待:让进程一次性申请完所有的资源。

  • 预防不可抢占:(1)当占有资源的进程进一步申请资源的时候,拒绝,然后强制释放当前占用的资源。必要时可再申请。(2)当一个进程请求被另外一个进程所占据的资源的时候,操作系统可以抢占这个占据资源的进程。要求释放资源。第二种方案只有在任意两个进程优先级不同的情况下.

  • 预防循环等待:定义资源访问线性序列


4、TCP 与 UDP 的区别


  1. 基于连接与无连接。

  2. TCP 要求系统资源较多,UDP 较少。

  3. UDP 程序结构较简单。

  4. 流模式(TCP)与数据报模式(UDP)。

  5. TCP 保证数据正确性,UDP 可能丢包。


5、算法题:给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。


答案解析:给定一个非空字符串 s 和一个包含非空单词列表的字典wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词答案解析


Android




1、自定义 View 需要重写那些方法?


(结合实际需求,需要滑动则重写 onTouchEvent,需要控制自身布局则重写 onMeasure,onLayout)


2、如何进行布局优化呢?


答案解析:布局优化_qq_39477770的博客-CSDN博客


3、Handler 消息机制


答案解析:Android Handler消息机制原理最全解读(持续补充中)


4、说说你对 UI 优化的理解


答案解析:UI优化_wfeii的博客-CSDN博客_ui优化

三、新浪(2020.12.21)

1、介绍项目


刚刚说了,不多介绍


2、有没有了解过插件化?插件化和组件化什么区别?


答案解析:模块化、组件化和插件化的区别


3、什么时候用 Application 的 Context,什么时候用 Activity 的 Context


答案解析:什么时候用Application的Context,什么时候用Activity的Context_lulinhua1010


4、一定要在主线程中更新 UI 吗?能不能在子线程更新?


答案解析:一定要在主线程中更新UI吗?能不能在子线程更新?


5、kotlin 是如何兼容 Java 的?


答案解析:kotlin是如何兼容Java的?答案解析


复盘了这么多,其实细心的朋友可以发现,大厂面试对 Java 基础、Android 基础还是比较看重的,所以在面试前,进行一波知识的梳理是很有必要的。


1、Java 基础面试考察点




  • JVM 工作流程

  • 运行时数据区(Runtime Data Area)

  • 类加载器

  • 垃圾回收 GC

  • String、StringBuffer、StringBuilder

  • 接口

  • HashMap

  • 单例模式

  • 线程的属性、状态、状态控制

  • synchronized

  • volatile



2、Android 基础面试考察点




  • Activity:生命周期、启动模式、启动过程

  • Fragment:特点、生命周期、与 Activity 通信

  • Service:启动过程、绑定过程、生命周期、启用前台服务(注册过程)、BroadcastReceiver、ContentProvider、数据存储

  • View:MeasureSpec、MotionEvent、VelocityTracker、GestureDetector、View 的滑动、Scroller、事件分发、自定义 View、Draw 的基本流程

  • 进程:进程的生命周期、多进程、OOM_ADJ

  • Parcelable 接口:Parcelable 与 Serializable 对比

评论

发布
暂无评论
你知道 Android 面试官最喜欢问那些技术点嘛?这篇带你复盘往年面试题!