Android 开发面试中,面试过最喜欢问那些问题?
这是我前几天在知乎上面看到一个热门话题,看到后起了兴趣就试着往下翻了翻,看到下面的回答都是在分享、讲述自己的面试经历、面试感受以及面试后感想和总结。不妨的说很精彩。
但是看到提问时间是在 3 年前,为什么 3 年后的今天还能掀起热浪呢?
想着这个问题,我就把问答完整的阅读了一遍。想了提问时间,又想到了我收到的推送时间。才明白原来快到了“金九银十跳槽黄金期”,大部分的程序员都在跃跃欲试,所以三年前的问答就再度掀起热浪。
想想我在互联网行业已经吃了三年的青春饭,这几年面试过的大厂不少于十家。拿到了 offer 也有 3 家,其中包含了小米、网易、还有一个新浪,现在在字节跳动划水摸鱼,有机会一起哈!我拿到手的 offer 的平均水平都在 24K——27K 左右(工作 1—2 年),借着问答的机会作一波面试复盘。
一、小米(2019.4.17)
1、介绍项目
我之前是做了新闻 App,相当于低仿的今日头条吧!
基本功能:
欢迎页面加载(3s,点击可跳过)——Activity 相关
用户注册/登录 ——SQLite 运用
横向滑动列表显示新闻类别——TabLayout、ViewPager、FragmentPagerAdapter 的应用
底部菜单栏 切换——Fragment 运用
主页(显示新闻列表)——ListView
设置(退出应用、退出登录、清空缓存)——Activity 管理、SharePreference
我的(账号安全、新闻收藏夹)——SQLite
新闻列表下拉、上滑实现刷新——自定义 ListView
逐条收藏新闻、删除新闻——SharePreference
仿 UI 界面——各类控件运用
点击查看新闻详情 —— WebView
用户界面更换头像功能——Android 运行时权限、多媒体、Content Provide
2、简单说一下 Activity 生命周期?
下图是 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 dispatchEnd;
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。
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 的区别
基于连接与无连接。
TCP 要求系统资源较多,UDP 较少。
UDP 程序结构较简单。
流模式(TCP)与数据报模式(UDP)。
TCP 保证数据正确性,UDP 可能丢包。
5、算法题:给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
答案解析:给定一个非空字符串 s 和一个包含非空单词列表的字典wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词答案解析
1、自定义 View 需要重写那些方法?
(结合实际需求,需要滑动则重写 onTouchEvent,需要控制自身布局则重写 onMeasure,onLayout)
2、如何进行布局优化呢?
答案解析:布局优化_qq_39477770的博客-CSDN博客
3、Handler 消息机制
答案解析:Android Handler消息机制原理最全解读(持续补充中)
4、说说你对 UI 优化的理解
答案解析:UI优化_wfeii的博客-CSDN博客_ui优化
三、新浪(2019.12.21)
1、介绍项目
刚刚说了,不多介绍
2、有没有了解过插件化?插件化和组件化什么区别?
答案解析:模块化、组件化和插件化的区别
3、什么时候用 Application 的 Context,什么时候用 Activity 的 Context
答案解析:什么时候用Application的Context,什么时候用Activity的Context_lulinhua1010
4、一定要在主线程中更新 UI 吗?能不能在子线程更新?
5、kotlin 是如何兼容 Java 的?
复盘了这么多,其实细心的朋友可以发现,大厂面试对 Java 基础、Android 基础还是比较看重的,所以在面试前,进行一波知识的梳理是很有必要的。
JVM 工作流程
评论