本帖最后由 就业高冷派 于 2016-12-5 15:58 编辑
很多面试者都可能会碰到一个问题:面试机会挺多的,但是就是没有拿到offer是怎么回事呢?其实很多人面试了一段时间基本上所有知识点都已经掌握差不多了,但是在公司那边得到的答复总是:回去等通知。这个是什么原因呢?最近我去跑了一下市场,了解到的情况就是由于Android方面的开发人员逐年增长,公司的选择增多,所以公司对于这方面的需求越来越高,以至于Android方面的面试题越来越趋于底层化,也就是说面试的问题问得更深入,要求能把底层的实现思想能弄明白。废话不多说,直接看看这两家面试问的相关问题吧! 参加面试者:就业部-飞哥
公司情况介绍:
【公司名称】中软国际
【公司地址】锦业一路软件大厦A座
【公司详情】中软国际有限公司(以下简称:中软国际)是中国领先的大型综合性软件与信息服务企业,成立于2000年。
面试经过:
这次面 试没有 经过人事面 试,直接就三 轮技 术面 试的 轮番 轰炸,在 这个 过程中我把 问过的 题目和当 时我怎么回答大致 记录了下来,希望可以 给大家提供一定的帮助,那我 们直接上 题吧!!
华为面试题: 1.你们是怎么实现网络请求的?是否可以自己搭建一个网络请求框架,大体的实现流程是什么? 答:平时基本都是使用第三方框架,因为首先公司考虑效率问题所以没那么多时间去给我们手动打造一个网络请求框架,但是我去稍微看了一下volley相关的底层实现,它大致是通过维护一个消息队列,用语管理网络请求的相关任务,只不过还需要考虑各种并发之类的问题业务比较繁琐,这个消息队列另外的一个作用就是当这个请求如果还没执行而且不想继续请求了,那么可以调用一个方法把这个操作从队列中移除,这个就可以取消对应的操作。大致的实现流程就是这样的。 2.你们公司网络安全是怎么实现的? 答:主要使用了https双向认证技术以及sqlcipher的方式对数据库进行加密操作。然后介绍https等相关东西,比如说双向认证,客户端和服务器端都有自已一套公钥和密码,然后进行公钥互换,在发送消息的时候通过使用公钥进行加码然后收到之后使用私钥进行解密,这样即使中途信息被抓包等手段拦截下来里面的数据信息也无法查看从而保证其安全性。而sqlcipher可以对数据库进行加密,它与普通的database不同之处在于如果导出通过sqlite等软件是无法直接打开浏览里面的数据信息的,只能通过代码里面输入正确的密码才能进行增删改查的操作。 3.当网络请求的时候如果信息量很大的时候如何实现多信息处理,如何缓存到内存中。(lrucache,当时也没说啥,主要是跟线程池相关的一些操作吧) 答:首先介绍了一下四种线程池,每一种线程池都有什么特点,比如说有的线程池是不对线程进行回收的,一直存在在池子内。有的线程池则会在线程不够用的时候会把任务放到等待队列中进行等待,直到有空闲的线程才进行处理等等。另外说到缓存,就介绍一下lrucache这个类,它的底层数据结构是LinkHashMap,它会把经常使用的对象放在链表的前部,不常用的对象放在链表的后面,当内存不够的时候会对链表后部分对象进行回收;接着再介绍一下强弱引用相关的内容。 4.AsyncTask缺点是什么? 5.在handler使用过程中有没有出现过messagequene阻塞的情况(应该是问的ANR方面的东西) 答:这个问题面试官问的时候也没有描述的很清楚,所以当时我是把我理解的说出来,这方面就说一下anr相关的东西,比如说你在ui主线程做了耗时操作,在activity中等待时间超过了5s的话就会报异常,service是20s等等。 6.给我说说如何自定义view的,平时柱状图或者饼图你们都是怎么做的? 答:平时基本上公司为了能快速完成项目,我们都没那时间完全自定义,所以我们都是通过找到第三方的一些控件,进行一定的修改之后符合我们的需求之后就会直接使用,当然,我们在修改别人的控件的时候需要知道自定义控件的流程,那么这时候我就开始介绍onmeasure、onlayout、ondraw三个方法都是干嘛用的,介绍一下什么时候会调用哪个方法之类的。顺便在这个话题结束前我把话题转到的view的事件分发机制,这时候我们就可以介绍view的事件分发的三种模型。 7.地图用过吧?你都用过什么功能?火星坐标的算法你们当时是怎么实现的?如果让你自己定义算法怎么定义。 答:主要用到定位相关的功能,大致要把一些关键的类名说出来,比如说定位用的是LocationClient这个api,在manifest需要注册一个服务,然后百度地图会在设定的时间在后台不间断的获取定位信息,然后通过接口回调等方式不断的把位置信息返回给我们。火星坐标相关的在百度地图已经通过LocationClentOption进行了设定bd0911,这样就不会出现偏移很大的情况,至于底层是怎么实现的还要去看看它的源码,我当时没看所以这方面我就说百度地图已经给我们做好了,直接用就行了。 8.如果你的项目太大,你可以通过哪些方式对项目进行瘦身? 答:一、从图片方面做,因为图片会占用很大的空间,如果可以的话尽量放到服务器端,不要都直接放倒项目的资源目录中。 二、把一些数据库可以删掉的话就删掉直接使用服务器提供(比如电话归属地的数据库可以放到服务端,需要用的时候通过接口去查询就行了)。 三、对代码进行分析,把内存泄漏相关的隐患进行处理,并对代码进行优化抽取,把重复使用的代码块进行抽取封装。 9.如何对数据量比较大的数据进行同步请求?(线程池相关的东西)线程池有多少种,没中线程池都有什么特点呢? 10.在使用即时通信的时候如果创建太多socket的话会不会让服务器越来越卡? 答:我当时说我集成的是环信,这些问题我相信环信已经完善得很好了所以我在这方面暂时还没去过多的了解。
公司情况介绍:
【公司名称】远古信息科技有限公司
【公司地址】陕西省西安市高新区科技二路72号西安软件园唐乐阁D102
【公司详情】西安远古信息科技股份有限公司(简称“远古信息”)是中国领先的旅游休闲产业信息化综合解决方案的提供商,国家级高新技术企业,中国旅游休闲行业信息化标杆企业。
面试经过:
这次面 试首先是人事面 试,基本 人事的面试大同小异,所以咱们人事这块就不详细介绍了,咱们主要去领略一下公司技术这块到底会问些什么东西。当时笔试题是没有,直接就是技术部等总监直接面的我,所以回来之后我就把每一个题都写出来,然后给出了我当时的回答方向,仅供参考,如有错误,欢迎指出,那么,我们就直接上题吧! 1. 自定义view你们是怎么做的? 答::平时基本上公司为了能快速完成项目,我们都没那时间完全自定义,所以我们都是通过找到第三方的一些控件,进行一定的修改之后符合我们的需求之后就会直接使用,当然,我们在修改别人的控件的时候需要知道自定义控件的流程,那么这时候我就开始介绍onmeasure、onlayout、ondraw三个方法都是干嘛用的,介绍一下什么时候会调用哪个方法之类的。顺便在这个话题结束前我把话题转到的view的事件分发机制,这时候我们就可以介绍view的事件分发的三种模型。 2. 在聊天模块中怎么实现既能输入文字也能输入表情,还能添加图片呢? 答:其实网上也有类似的第三方自定义控件,大体的实现思路我觉得应该是这样的:表情等显示其实是通过通配符等匹配显示的,我们在发送的时候其实发送的是一对通配符,只要我们本地有相关的表情库,就可以通过通配符的方式进行匹配显示。至于一些细节方面等问题还是需要去看源代码分析才可以。 3. 百度地图中定位是怎么实现的? 答:定位用的是LocationClient这个api,在manifest需要注册一个服务,然后百度地图会在设定的时间在后台不间断的获取定位信息,然后通过接口回调等方式不断的把位置信息返回给我们。 4. 显式意图和隐式意图的区别 答:显式意图一般在应用的内部使用,因为在应用内部已经知道了组件的名称直接激活就行了。 隐式意图是在应用与应用之间使用,当一个应用要激活另一个应用中的Activity时看不到源代码,只能使用隐式意图,根据Activity配置的意图过滤器建一个意图,让意图中的各项参数的值都跟过滤器匹配,这样就可以激活其他应用中的Activity。所以,隐式意图是在应用与应用之间使用的。
5. 提到图片的加载,OOM的主要原因,三级缓存 答:首先先说明系统给每个手机应用分配等内存是固定的,当加载图片超过这个值的时候就会出现OOM的情况,另外就是如果内存泄漏到一定量了也会出现OOM的情况。然后说说什么是三级缓存,图片等缓存怎么做的,怎么通过时间戳的方式让缓存具有时效性,保证我们的图片与服务器端的数据可以一致。 6. 给我说一下你对事件处理和分发的认识 答:介绍一下事件分发的三种模型,还有里面的三个方法都是什么时候调用的dispatchtouchevent、intercepttoutchevent、toutchevent三个方法。 7. 项目中聊天模块你是怎么实现的,给我说说它的实现原理。 答:集成了环信的SDK实现聊天模块,原理的话就介绍一下它是基于XMPP协议等然后聊了一下UDP和TCP协议以及分别怎么搭建的客户端和服务器端(基础的那一点点代码稍微描述一下,以及accept方法和receive方法具有阻塞的特点)。最后再说一下在socket中什么是三次握手。三次握手就是我这边喊一声“我要发送数据啦”,然后服务器收到后回复一声“我到啦”,然后第三次我这边再喊一声”我知道啦“,第三声的作用就是告诉服务器我也可以正常收到啦,第二声是服务器告诉我它可以正常收到啦,所以三次握手一次都不能少,这样就能完全保证对方是可以正常收到数据的。 8. 在你们项目如何实现安全性的?都有哪些途径提高安全系数? 答:主要使用了https双向认证技术以及sqlcipher的方式对数据库进行加密操作。然后介绍https等相关东西,比如说双向认证,客户端和服务器端都有自已一套公钥和密码,然后进行公私钥互换,在发送消息的时候通过使用公钥进行加码然后收到之后使用私钥进行解密,这样即使中途信息被抓包等手段拦截下来里面的数据信息也无法查看从而保证其安全性。而sqlcipher可以对数据库进行加密,它与普通的database不同之处在于如果导出通过sqlite等软件是无法直接打开浏览里面的数据信息的,只能通过代码里面输入正确的密码才能进行增删改查的操作。 9. 多线程操作的时候你们是怎么保证线程的安全性的。 答:加上同步锁的方式,然后举例说明一下不加的话会出现的问题,最好能说说死锁相关的就可以了。
问完技术之后老总那边开始跟我谈,主要是想验证一下我的经历是否是真实的,说他刚从深圳回来(我简历上的公司是写的广州的公司),聊了聊相关广州那边的事情以及以前开发团队相关的一些细节,还有对自己人生职业规划之类的(特别是以前公司所在团队的人数、如何分工等等这些细节,咱们得提前准备好相关的东西)。 面试结果: 该公司过后一天给我打来电话,说我这边薪资这块能不能调整一下,然后说了一大堆公司发展前景很广泛,不要太计较眼前利益之类的话,最后的结论就是给不了这么高的工资,大概只有六千左右,然后就没有然后了。 通过上述的两个例子体现出来,咱们当前行业不能仅仅局限于自己的代码逻辑,还要求需要去读懂第三方框架的大体实现思路以及流程,需要关注当前比较流行的设计思想,最后再结合上自身扎实的基础功底,这样一份满意的高薪工作将不再遥远!!!
通过上述的两个例子体现出来,咱们当前行业不能仅仅局限于自己的代码逻辑,还要求需要去读懂第三方框架的大体实现思路以及流程,最重要的还是要把看了的能流畅的表述出来;另外,还需要关注当前比较流行的设计思想,最后再结合上自身扎实的基础功底,这样一份满意的高薪工作将不再遥远!!!
|