记录android又一次找工作的面试题
2020真的是个不顺的一年 ,年前遭遇拖欠薪资,因为疫情找了几个月的工作,在转正后没两个月就又经历了一次裁员,幸好这个渣渣技术的我没有多久就又一次开始上班了。记录一下这次面试中问到的问题,也提供给初级的安卓开发一点点参考。
1.全局变量跟局部变量区别 ;
1.作用域不一样,全局变量作用域在整个工程中 局部变量作用域在整个函数中
2.内存分配不一样,全局变量存放在全局静态存储区中,局部变量存放在栈中只有在函数被调用是才会分配存储单元
3.生存期不一样 全局变量跟随进程局部变量跟随的是函数函数调用后就回收
2.ViewGroup和View的onDraw方法区别 ;
1.viewgroup中的ondraw方法正常是不会调用的 如需调用需要设置setwillnotdraw方法才会调用或者给viewgroup设置背景色
2.View的ondraw方法只需要绘制view本身而viewgroup的ondraw方法则需要绘制本身外还需要绘制子View
3.handler原理 ;
Handler由四部分组成 message messagequeue handler looper
首先message在messagequeue队列中排队 然后由looper中的looper()方法轮询messagequeue中的message 等到条件和message吻合后通过handler传递出去
Handler将message发送到looper的消息队列中,等待looper的循环读取message,处理message,然后调用message的target,即附属的handler的dispatchmessage()方法,将该消息回调到handlermessage方法中,然后完成更新UI操作
4.如何保证接口间通信安全 ;
1.使用token或者cookie校验
2.使用https
3.对敏感数据进行加密例如采用MD5加密
4.对部分敏感数据进行过滤 防止sql注入
5.对同一IP同一时间段内的多次请求进行限制
5.描述下OOM和相应的解决方法 ;
OOM就是内存不够用了 只需要的内存空间大于系统分配的空间,导致内存不够用从而应用崩溃。内存泄露内存溢出。如加载大图片导致内存溢出或者大量的内存泄露导致内存
解决办法
1.即时释放不需要的内存
2,在允许的情况下多使用软引用或者弱引用 因为这些会在内存不够的情况下优先回收
3,图片使用一次不再使用之后可以调用bitmap的recycle方法,或者加载大图的时候先压缩或者分片加载
4,注册系统的服务,使用完毕需要注销掉,等
6.retrofit原理 ;
涉及到的模式有:观察者模式,适配器模式,策略模式,构建者模式,外观模式,工厂模式,代理模式,是一个网络请求框架,底层的网络请求使用得还是okhttp.
Android使用retrofit实际上是使用retrofit接口层封装请求参数之后又okhttp进行网络请求
首先,通过Builder创建Retrofit对象,在create方法中,通过JDK动态代理的方式,生成实现类,在调用接口方法时,会触发InvocationHandler的invoke方法,将接口的空方法转换成ServiceMethid, 然后生成okhttp请求,通过callAdapterFactory找到对应的执行器,比如RxJava2CallAdapterFactory,最后通过ConverterFactory将返回数据解析成JavaBean,使用者只需要关心请求参数,内部实现由retrofit封装完成,底层请求还是基于okhttp实现的。
ServiceMethod
核心处理类,解析接口中定义的请求方法参数和注解,通过toCall方法将其转换成okhttp的call对象,有了Call对象,就可以发送请求了。
callFactory
字面意思就是生产Call的工厂,这里的Call是okhttp包下面的Call,CallFactory默
就是OkHttpClient
HttpUrl
就是将创建retrofit对象时传入的baseUrl转换成对象,进行格式校验等。
converterFactories
数据解析器Converter,将response通过converterFactory转换成对应的JavaBean数据形式,常见解析器有,GsonConverterFactory,FastJsonConverterFactory,当然也有xml的。
callAdapterFactories
通过calladapter将原始Call进行封装,找到对应的执行器。如rxjavaCallFactory对
的Observable,转换形式Call --> Observable
callbackExecutor
主线程执行器,返回结果在UI线程执行
validateEagerly
是否立即校验所以接口方法,也就是将接口类中的方法全部转换成ServiceMethod,默认
False
7.Android EventBus的原理 ;
Android EventBus是一个Android平台轻量级的事件总线框架.EventBus类似观察者模式,
eventBus的使用步骤分为定义事件、订阅事件、发送事件、处理事件、取消订阅五步
首先需要在oncreate方法中注册然后pushlisher post一个事件,最后subscribe事件订阅者接收特定的事件信息,根据事件特定的信息指定操作更新UI。他可以向不同的线程发布事件。在ondestroy中需要取消订阅
8.okhttp的拦截器 ;
拦截器可以用来转换,重试,重写请求的机制
可以自定义拦截器 只需要集成intercept类
拦截器分为两类 应用拦截器和网络拦截器
应用拦截器:有两种注册方法 第一个在okhttpclient.Build中直接添加(new okhttpclien.Build().addintercept(intercept)),还有一种是在okhttpclient中直接通过add的方式添加 ( new okhttpclient.interceptors.add(intercept)).主要用于查看请求信息及返回信息,如链接地址,请求参数,头信息等
网路拦截器:也有两种注册方法一种是在new okhttpclient.build().addNetWorkInterccept(intercept),还有一种是在okhttpclient中直接通过add的方法注册 (okhttpclient.networkinterceptors.add(intercept))
可以添加,删除,替换请求头信息还可以改变请求携带的实体
应用拦截器
不需要担心中间过程的响应,如重定向和重试.
总是只调用一次,即使HTTP响应是从缓存中获取.
观察应用程序的初衷. 不关心OkHttp注入的头信息如: If-None-Match.
允许短路而不调用 Chain.proceed(),即中止调用.
允许重试,使 Chain.proceed()调用多次.
网络拦截器
能够操作中间过程的响应,如重定向和重试.
当网络短路而返回缓存响应时不被调用.
只观察在网络上传输的数据.
携带请求来访问连接.
9…android 性能优化 ;
1.启动页白屏 因为启动的时候还未加载出来 ,可以在mainfest中设置启动activity的背景 在style中设置
2.减少布局的嵌套,层级
3.图片的处理 使用三级缓存 内存—sd卡–网络存储。大图压缩处理在放到内存中,使用bitmapfactory类。
4.大量数据采用分页加载和缓存的方式
5.网络优化 同一个页面中尽量减少网络请求的次数,尽量使用一个接口解决
6.Oncreate尽量减少一些不必要的操作
7.应用中使用svg格式的图或者webp格式的图缩减apk包的体积
10.屏幕适配 ;
1.布局使用特有的dp单位
2.多套同样的布局来适配不同的分辨率 使用布局限定符
3.代码适配,在java代码中获取屏幕的宽高分辨率来动态设置控件
4.布局组件上 尽量使用一套布局来解决,无非必要 不适用绝对布局多使用线性布局和相对布局
5.借助第三方提供的适配框架 例如头条的方案