昨天去欢聚时代面试了,总的来说回答的很不完美,基本上没戏了,在这里记录一下吧,想的起多少就写多少。
本人已经辞职了,但是公司不让马上走,要等30天,然后我在BOSS直聘APP上登录了一下,更新了一下简历,本想着等离开了公司就开始投简历,没想到当天就收到一大堆的求简历。第二天也是一大堆,然后看到了欢聚时代,有点惊讶,我以为像欢聚时代这样的大公司是不会主动这样求简历的,但事实就是这样,然后就把简历发过去了。这里不是打广告,是真心的觉得BOSS直聘挺好的。
过了几天,接到欢聚时代HR的电话预约面试,还是很惊喜的。昨天下午面试,虽然准备的不是很充分,但是去看看也是好的,请个假大大好几百,肉疼。
没有提前到公司,是踩点的,不幸的真的找不到公司,万达广场太大了,问了半天终于找到B1栋在哪里了,然后等电梯,28楼,也是等了很久,足足迟到了20分钟。所以以后面试不要踩点了,尽量早半个钟到吧,撒个尿也是好的。
到了前台,扫二维码签到,然后到旁边的大厅填写资料,是在手机上填的。大厅上很多人,应该都是在面试的吧,瞬间觉得没希望了,就是这么负能量哈哈,但是来之安之吧。填资料也是很坑,面试我一般不会填身份证的,但YY要求必填。。。然后我就填了18个X。然后是学习经历,随便填了一下。然后是工作经历,也随便填了一下,有一项是直接上司和手机号码,必填。。。我们平时都是钉钉沟通了,实在不知道号码。。。乱填了一番。最后是项目经验,这个这个。。。不可能现场写的了,这辈子都不可能的,抄的话也不可能,太多了,也罢,不写了,直接跳过。
这么多人我以为要等很久,结果就几分钟,一个胖纸叫我去面试了,明显感觉到大家羡慕的目光哈哈,他们等了辣么久,我刚来啊哈哈。胖纸带我转了一圈,想找个房间,结果都有人了。这里得赞一下YY的这种接待室,应该有十几个吧,半透明的小房间,圆的方的什么造型都有,里面就一张桌子和几张凳子沙发什么的。再等了几分钟,可以开房了。
没有笔试。
居然没有笔试。
没有想到没有笔试。
自我介绍,随便说了一下,自己都觉得语无伦次,渣的一批,可是胖纸挺好,适度插嘴,我就喜欢他插嘴,因为我也不知道往下还有什么说的哈哈。然后胖纸看着我的简历,一边问问题,一边记笔记,还是很认真的,虽然我回答的很表面,他有时候也会深入一点问原理什么的,我大多都答不上来,但是胖纸很和蔼,气氛依然很好,我答不上来的我偶尔还会反问他,他也跟我说了。
输出什么
String s = "hello";
public void test(String s) {
s = "world";
}
test(s);
System.out.println(s);
胖纸手写的代码,我一看这个就说输入hello了,然后胖纸说为什么,我一下子居然答不上来,如果传入的是一个普通对象的话,那传入的就是引用了,值是会变的,但是这个是String,这个东西我一直有点怕。最后胖纸跟我说这个String保存的是值,传入方法中的是值,而不是引用,所以不会改变外面那个s的值。
multiDex的原理是什么
一脸懵逼,我只知道这是分包用的,只会用不知道原理。
简历上说封装了某某View,你是怎么封装的
怎么封装的,不知道从哪里开始说起啊
你是怎么自定义View的
我也不知道怎么说啊,就叫胖纸举个具体的例子。然后胖纸说如果自定义一个闹钟界面,我大概说了一下继承View,在onMeasure中测量大小,在onDraw中绘画闹钟。然后胖纸说就这么简单?在onMeasure中是怎么测量大小的?
Android的事件传递机制什么什么样的
这些问题我感觉我是说不清楚的,用笔画图还可以说清楚,当时又没带笔,然后就大概说了一通,事件从根节点的dispatchTouchEvent分发,开始传递,可以用onInterceptTouchEvent拦截,子View也可以反驳拦截,有个反驳的API,忘了叫什么了,如果没有拦截,那就继续传递给子View,在onTouchEvent可以监听,返回true消费掉事件。这个传递机制我自认为是比较了解的了,但是口头描述不清楚。
Handler的机制
Handler负责发送消息,和处理消息,创建Handler的时候需要传入一个Looper,Looper维护着一个消息队列MessageQueue,Looper不断循环从消息队列里拿到消息交给Handler处理。如果需要在子线程维护一个消息队列的话,需要在子线程调用Looper.prepare初始化,然后Looper.loop开始循环读取消息。
然后胖纸问,如果new Handler的时候不传入Looper,那么Looper是怎么来的,我说在哪个线程new的Handler,就拿哪个线程的Looper,如果是子线程的话需要先Looper.prepare初始化一下,胖纸也懵逼了,应该他不是想问这个,然后我只好说没看过源码不清楚了。然后胖纸又问:主线程的Looper怎么拿的,我:Looper.getMainLooper,胖纸:子线程的Looper又是怎么拿的,我:Looper.myLooper,然后胖纸想了半天,有myLooper这个东西么,说到我也不确定有没有了。。。
// Handler的部分源码
public Handler() {
this(null, false);
}
public Handler(Callback callback, boolean async) {
// ...
// 没有传入Looper的时候的确是调用了Looper.myLooper()获取。
// 而且当前线程必须先调用Looper.prepare()
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
// ...
}
public final class ActivityThread extends ClientTransactionHandler {
// app的启动入口,这是进程孵化器已经创建出app进程了
// 这是第一个线程,直接作为主线程
public static void main(String[] args) {
...
// 初始化Looper
Looper.prepareMainLooper();
...
}
}
public static void prepareMainLooper() {
prepare(false);
synchronized (Looper.class) {
if (sMainLooper != null) {
throw new IllegalStateException("The main Looper has already been prepared.");
}
// 由下面的getMainLooper()方法可以知道,我们去的就是这个sMainLooper
sMainLooper = myLooper();
}
}
public static Looper getMainLooper() {
synchronized (Looper.class) {
return sMainLooper;
}
}
Java内存管理
Java垃圾回收机制
Activity的singleTop和singleTask的区别
这个我还是比较清楚的,还有singleInstance我也说了一遍。
Service的两种启动模式有什么区别
startService和bindService的区别我也是比较清楚的,也说了一遍,然后他深入的问。。。
Service的onStartCommand的几种返回值有什么区别
一脸懵逼。我只是隐约记得有个什么STICKY,粘性的,还有什么忘了,有什么区别,也忘了。
没有了,想不起来了
其它的想不起来了,就酱紫了。
差不多走的时候,胖纸突然说面试会有好几轮,叫我慢慢等,不知道他是什么意思,我认为我应该是直接PASS掉的了,那就没有下面的轮了,也没必要跟我说还有好几轮了,我就随便问了一下每轮相隔时间会不会是一个月,胖纸说要排队看情况,走人。