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);
        }
    }

}

很明显,内部类就是类里面的一个类,写法与创建一个外部类没有差别,内部类里面的方法可以访问外部类里面的所有属性。

@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层完成替换。

https://blog.csdn.net/qinbin2015/article/details/90442354

8.讲一讲OkHttp的核心原理。

主要是通过 Diapatcher不断从 RequestQueue 中取出请求(Call),根据是否已缓存调用 Cache 或 Network
这两类数据获取接口中的一个,从内存缓存或是服务器取得请求的数据。
该引擎有同步和异步请求,同步请求通过 Call.execute()直接返 回当前的 Response,而异步请求会把当前的请
求 Call.enqueue 添加(AsyncCall)到请求队列中,并通过回调(Callback) 的方式来获取最后结果。
 
9.Retrofit+Rxjava用过吗?
说实话,我一直用的都是OkHttpUtils,并没有用过Retrofit+Rxjava,既然别人问了,就研究一下吧。
还是很简单地吧。利用RxJava可以切换不同线程去做想要做的事。
 
 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AD钙奶-lalala

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值