Android⾼级岗⾯试实战01——某车载平台电话技术⼀⾯今天约了⼀家做车载的Android⾼级岗电话⾯试,由于接近40个⽉没有⾯过试了,感觉还是有点⽣疏,回答的不是很好,所以在此做⼀个整理。⾯试题都不是很难,但是都很经典,可以很好地考察Android的基本功。
1.讲⼀讲匿名内部类。
当突然被问到这个问题还是没反应过来,匿名内部类很熟悉的名字,思绪回到了N多年前学习java基础的时候,但是到最后还是没回答上来。
⾸先回忆⼀下什么是内部类:
public class A {
private int a;
public String name;
//内部类
public class B {
public void printLog(){
//内部类可以访问外部类的公有和私有属性
Log.i("tag",name + "--" + a);
android retrofit}
}
}
很明显,内部类就是类⾥⾯的⼀个类,写法与创建⼀个外部类没有差别,内部类⾥⾯的⽅法可以访问外部类⾥⾯的所有属性。
@Override
protected void initListener() {
rlLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
Android中常⽤的的匿名内部类就是写点击事件的时候,可以理解为实现这个接⼝的类的对象,顺便实现接⼝⾥⾯的⽅法。匿名内部类的写法可以简单理解为实现这个接⼝的对象。
2.简历上看你⽤过NDK,你都⽤NDK做过什么?
NDK开发需要懂C/C++,我们经常会进⾏⼀些图形图像处理,我们知道图形图像处理的库⼤部分是基于C/C++的,因为C/C++有更⾼的效率,我使⽤NDK主要是进⾏⼀些图像处理,⽐如美颜等。
3.讲⼀讲哪些情况会导致内存溢出?
这个问题应该⽐较简单,下⾯就列出集中导致内存溢出的场景:
01.资源释放问题,⽐如Cursor,IO流,Context引⽤没有及时释放
02.对象内存过⼤,⽐如⼤图⽚
03.static关键字的使⽤问题
4.讲⼀讲除了图⽚以外的内存优化你都做过哪些?
01.及时的检查代码,看看Cursor,IO流,Context引⽤没有及时释放
02.应该尽量避免static成员变量引⽤资源过多的实例,⽐如context
5.说说你在项⽬中的UI框架是如何实现的?
⾃定义⼀个类继承⾃FrameLayout,在⾥⾯添加加载成功,加载错误,⽹络错误,没有数据等状态下的布局⽂件,控制显⽰或者隐藏。在Fragment的onCreateView⽅法中使⽤返回UI框架返回的各种类型的View。
6.讲⼀讲Glide的原理。
原理这个东西看你怎么讲,深⼀点就讲源码,但是源码这个东西你过段时间不看就忘了,导致⾯试的时候⽆从讲起,我就在想那不如把源码变成通俗易懂的⼤⽩话。
Glide 原理的核⼼是为 bitmap 维护⼀个对象池。对象池的主要⽬的是通过减少⼤对象的分配以重⽤
来提⾼性能。Dalvik 和 ART 虚拟机都没有使⽤ compacting garbage collector,compacting garbage collector 是⼀种
模式,这种模式中 GC 会遍历堆,同时把活跃对象移到相邻内存区域,让更⼤的内存块可以⽤在后续的
分配中。因为安卓没有这种模式, 就可能会出现被分配的对象分散在各处,对象之间只有很⼩的内存
可⽤。如果应⽤试图分配⼀个⼤于邻近的闲置内存块空间的对象,就会导致 OutOfMemoryError,然后
崩溃,即使总的空余内存空间⼤于对象的⼤⼩。
使⽤对象池还可以帮助提⾼滚动的性能,因为重⽤ bitmap 意味着更少的对象被创建与回收。垃圾回
收会导致“停⽌⼀切(Stop The World)”事件,这个事件指的是回收器执⾏期间,所有线程(包括 UI 线程)
都会暂停。这个时候,图像帧⽆法被渲染同时 UI 可能会停滞,这在滚动期间尤其明显。
7.简单讲⼀下热修复原理。
⽐如说我现在⽤的是阿⾥的Sophix,下⾯以AndFix为例来讲讲热修复原理:
andFix是通过替换⽅法表中的⽅法实现热修复的,是native层的实现。AndFix做了什么呢?⾸先⼀个是差分包⼯具,这个可以理解为⽐较两个apk⽂件的异同,将有变化的⽅法加上注解(类名,⽅法名)。差分包被加载后,遍历⾥⾯的⽅法,到被注解的⽅法,通过反射到对应的⽅法名,在native层完成替换。
8.讲⼀讲OkHttp的核⼼原理。
主要是通过 Diapatcher不断从 RequestQueue 中取出请求(Call),根据是否已缓存调⽤ Cache 或 Network
这两类数据获取接⼝中的⼀个,从内存缓存或是服务器取得请求的数据。
该引擎有同步和异步请求,同步请求通过 ute()直接返 回当前的 Response,⽽异步请求会把当前的请
求 queue 添加(AsyncCall)到请求队列中,并通过回调(Callback) 的⽅式来获取最后结果。
9.Retrofit+Rxjava⽤过吗?
说实话,我⼀直⽤的都是OkHttpUtils,并没有⽤过Retrofit+Rxjava,既然别⼈问了,就研究⼀下吧。
还是很简单地吧。利⽤RxJava可以切换不同线程去做想要做的事。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论