今天去了著名的百度面试,百度的环境很好,我很喜欢。
我在大厅等了一会,前台在帮我预约面试官。不一会面试官来了,看起来他穿的很随意。我想百度的工作氛围应该还是较为开放自由的。
人把我带到了,很多圆形桌子的一个地方,好像这个地方是专门面试用的,周围零零散散有几个一同面试的。这个面试官看起来挺有亲和力。先是让我介绍一下之前做的项目。于是我简单的说了每一个项目是做什么的,负责比较多的是哪里等等。说完之后,他给我一张纸。上面两张图,一张图上画着一个webview,下面是两个按钮,一个叫网页,一个叫列表,webview里写着一个apk的http地址。第二张图是一个列表页面,然后子项里包含一个进度条,和一个暂停按钮。看完之后他们说,点击第一个webview里面的链接,跳转到第二个页面(列表页)。他让我设计一下这个程序。我仔细看了一下。首先我说了下A这个activity的布局,和B的布局。OK。这应该不难。下面的两按钮,我看做是ActivityGroup。功能上,我思考了一下。这考的应该是android与JS的交互,还有就是下载这个方法的写法,再有就是如何更新进度条,更新进度条可能涉及到线程之间的通信问题。整理好思路,我跟他一步步的说。首先,webview加载的html里包含了一个链接,可以把webview添加一个JavaScriptInterFace接口,然后出现clickOnAndroid()这个方法。在这里面可以调用下载方法。 然后写一个下载的方法,new 一个byte[],这的大小可以随时取到,然后服务器会返回这个apk的大小,根据下载过的字节数跟实际的大小比,就可以下载的百分比。这个下载方法可以放在B里,因为进度条也在B里。把A的链接地址传给B,就能在B里进行下载任务,这个下载是在一个线程里进行的。子线程进行下载,同时将下载量用Handler 发消息通知主线程更新UI(进度条)。
上述是这个例子部分的描述,其实难度倒是平易近人。只是在我说的过程中,面试官要求在纸上写出方法名,至少写伪代码。我比较习惯编译器了,所以有的方法名就记得不太清楚,就凑合用笔画着。面试官问的很细致,包括列表如果建立,适配器如何写,适配器里的getView如何写?这些都要问。写的部分大概就是这样。
然后我来总结一下他问的问题。
1、说一下activity的生命周期?A——B的时候,A走什么方法?会不会一直在onPause()?
2、服务的启动方式?服务与activity如何传递数据?
3、有没有用过异步?写出他的写法以及内部的方法。说明他们是在什么线程里?用的AsynTask时候遇到了什么问题?是如何解决的?或者是用AsynTask时候需要注意什么?
4、一个按钮如果变色(点击效果),要如何实现?
5、动画有几种方式?
6、刚才的下载,除了利用实现JavaScriptInterFace接口还有没有其他方法?
7、下载完了如何跳转到该软件的安装界面
8、能否在Thread的runable里面直接new Handler()?如果不能,说出原因?
9、如何使用数据库,写出来
第8题 没答上来 我预感应该不行,于是回去实验了一下,果然报错,大概的意思是,无法创建句柄(Android Can't create handler inside thread that has not called Looper.prepare()
),悲剧平时我也没这么用过,就知道很别扭。
不管怎么样,这是一次小小的经验和教训,希望可以从中收获就足矣。