写点什么

Android 面试(二)

发布于: 2021 年 01 月 20 日
Android面试(二)

面试了好几家大厂,全挂了。。。心态都炸完了,没办法,还得继续面试啊。我是真他吗的佛了,大家都是 control cv,老子就比别人弱吗?

app 加载流程知道吗?调用哪些方法?

1、启动进程:ams 通过 socket 通信告知 zygote 进程 fork 子进程。

2、实例化 activityThread: 执行 main 方法,创建 applicationThread、looper、handler,并开始 looper.loop()。

3、创建并初始化 application 和 actiivity: activityThread attach binder 通信,通知 system_server 执行 ams attachapplication 方法,初始化 application 和 activity。bindapplication 通知主线程 handler 创建 application,绑定 context,执行 application 里面的 oncreate()周期;通过主线程 handler 消息通知创建 activity,然后调用 callactivityoncreate,执行 activity oncreate 周期。

4、布局和绘制。

threadlocal 知道吗?有什么作用?

提供线程内的局部变量。提供一个线程内的公共变量,减少多个方法传递的复杂度。handler 如何找到当前绑定的 looper,也是用的 threadlocal。

线程池用过吗?可以简单说明下吗?

1、threadpoolExecutor: execute(runnable)执行。

corePoolSize: 核心线程的数量。

注意:线程池中存在核心线程与非核心线程,核心线程一旦创建会一直执行任务或等待任务到来,而非核心线程只在任务队列塞满任务时去执行多出的任务,并且非核心线程在等待一段时间后将会被回收,这个时间作为参数可调配,见下面的 keepAliveTime 参数。

maximumPoolSize:该线程池中最大线程数量。(区别于 corePoolSize)

keepAliveTime:从字面上就可以理解,是非核心线程空闲时要等待下一个任务到来的时间,当任务很多,每个任务执行时间很短的情况下调大该值有助于提高线程利用率。注意:当 allowCoreThreadTimeOut 属性设为 true 时,该属性也可用于核心线程。

unit:上面时间属性的单位

workQueue:任务队列,后面详述。

threadFactory:线程工厂,可用于设置线程名字等等,一般无须设置该参数。

1.execute 一个线程之后,如果线程池中的线程数未达到核心线程数,则会立马启用一个核心线程去执行。

2.execute 一个线程之后,如果线程池中的线程数已经达到核心线程数,且 workQueue 未满,则将新线程放入 workQueue 中等待执行。

3.execute 一个线程之后,如果线程池中的线程数已经达到核心线程数但未超过非核心线程数,且 workQueue 已满,则开启一个非核心线程来执行任务。

4.execute 一个线程之后,如果线程池中的线程数已经超过非核心线程数,则拒绝执行该任务,采取饱和策略,并抛出 RejectedExecutionException 异常。

2、FixedThreadPool (可重用固定线程数)

3、CachedThreadPool

4、SingleThreadPool(单个核心线程)

5、ScheduledThreadPool

6、PriorityThreadPool

hashmap 知道吗?底层是怎么样?


类加载方法知道吗?具体哪几种?


dvm 执行流程是怎样的?比如一个 activity 从开始创建到销毁,dvm 是如何工作的?细节可以说下吗?
沾包遇到过吗?你是怎么处理的?
https 用过吗?怎么握手的?怎么校验的?
自定义 view 用过吗?有几种方式?有几种测量方式?根据什么判断的?
okhttp3 用过吗?为什么要用呢?
fullgc 知道吗?什么时候出现的?遇到过吗?
你一般遇到和处理的都是堆溢出吗?有遇到别的溢出吗?怎样的场景呢?
图像处理库看过吗?怎么处理的?有哪些情况会影响到图片处理?你当前遇到的影响图像处理效率最大问题是什么?怎么避免呢?
mvvm 可以画一下流程吗?除了客户端还有别的地方还要用吗?
rn 和 flutter 看过吗?你觉得端未来的发展方向是什么?

没看过,大哥们都带头进场了,我等打工人怎样认为重要吗?不敢高声语,恐惊天上人哦。

handler 流程可以简述下吗?可以创建多个 handler 吗?


http1 和 http2 区别是什么?


cfs 算法知道吗?可以介绍下吗?
子线程一定不能更新 ui 吗?

可以,但是要早 onresume 之前,因为那个地方有个 checkThread 的判断,是子线程的话会抛出异常。

为什么不让子线程更新 ui?

因为 ui 控件不是线程安全的。

那为什么不加锁?

会降低 ui 访问效率,而且也会让 ui 访问逻辑变得复杂。

Android 使用的跨进程通信方式有哪些?

1、bundle,由于 bundle 实现了 parcelable 接口,所以很方便的在进程间通信;

2、文件,一个写入,一个读取;

3、messager,底层是 aidl;

4、使用 aidl,可以处理大量的到服务端的并行请求;在 Android 中使用方法:创建一个 Service 和一个 AIDL 接口,接着创建一个类继承自 AIDL 接口中的 Stub 类并实现 Stub 中的抽象方法,在 Service 的 onBind 方法中返回这个类的对象,然后客户端绑定服务端 Service,建立连接后就可以访问远程服务器了。

5、contentprovider,底层是 binder;

6、socket:支持任意字节流;

7、binder: server、client、serverManager、binder 驱动;

客户端发起请求时,当前线程被挂起直到服务端返回数据,所以一个请求是很耗时的,所以不能在 ui 中发起请求;服务端的 binder 方法运行在线程池中,同步去实现。

anr 遇到过吗?

(1)Service Timeout:Service 在特定的时间内无法处理完成 (2)BroadcastQueue Timeout:BroadcastReceiver 在特定时间内无法处理完成 (3)ContentProvider Timeout:内容提供者执行超时 (4)inputDispatching Timeout: 按键或触摸事件在特定时间内无响应。

内存泄漏怎么分析的?

先用 android studio 自带的 profile,可以看到内存、网络、cpu 等信息;然后点击下载按钮,可以看到整个工程当前被引用的对象;然后在倒出来,用 sdk 自带的 hprof 转换一下,然后一层层点下去,就可以看到谁持有这个对象了。


用户头像

编程随想 2021.01.12 加入

Android开发

评论

发布
暂无评论
Android面试(二)