下午2点半HR打电话,约面试时间,为了方便就约到了4点半。
睡了一觉醒来就直接去面试,面试过程中都不知道自己在说啥
面试内容如下:
- 简历里面有说到做硬件视频流的推送,说如果你来做的话如何做
- 调取CameraX等框架获取视频流帧数据
- 编码,使用MediaCodec对视频帧数据进行编码(就是压缩的意思,因为数据太大)
- 打包:编码后的视频帧数据进行打包
- 通常使用容器格式(如MP4、FLV等)
- 流媒体协议,如RTMP、RTSP等进行封装
- 传输:用RTMP、RTSP、Http协议传输
- 解封加解码:接收端解封工具解封,然后用MediaCodec解码
- 存储
- RTMP和HTTP的区别?
- RTMP这种更适合用来音视频和流媒体传输,可以低延迟,实时传输,HTTP这种就静态资源比较多
- 都是TCP为传输层协议
- OSI的七层模型
- 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
- TCP和UDP区别
- 面向链接和无连接,对应的传输速率等就有区别
- 你自己有了解这些网络底层的东西吗?
- 有看过OKHTTP的原理:
- 创建请求quest之后,OkHttpClient调用newCall()将Request封装成一个Call对象
- 同步请求,调用Call的excute()方法,在调用Dispatcher的excuted(),放入runningSyncCalls队列,进入拦截器链,发送请求,获得response后,调用finished出列;
- 异步请求,调用enqueue()方法
- 通过判断请求线程池里面的 同一地址的请求是否达到5,线程是否达到64
- ture的话,进入runningAsyncCalls队列,然后调用拦截器链条,发送请求
- false的话,进入readyAsyncCalls队列,等待条件满足时调用promoteCalls()方法进入上个步骤
- 后续执行发送请求,获得response后,调用finished出列
- 拦截器链,按顺序遍历interceptorList(拦截器链,这里面拦截器使用的是责任链的模式)
- 自定义拦截器可以自定义单个拦截器,也可以自定义拦截器链路的顺序
- 涉及的线程池一共两个:
- Dispatcher处理请求时候内部的excuteService线程池,是一个核心线程为0,非核心线程不限制的线程池
- 内部是一个同步队列,先来先出
- 发送请求的线程池,支持最大5个链路的keep-alive连接,并且默认keep-alive的时间是5分钟。
- 拦截器的类型有哪些?
- 重试及重定向拦截器 RetryAndFollowUpInterceptor
- 封装拦截器 BridgeInterceptor
- 缓存拦截器 CacheInterceptor
- 连接拦截器 ConnectInterceptor
- IO拦截器 CallServerInterceptor
- 自定义的拦截器
- 拦截器的执行顺序
- 先按照addInterceptor() 设置的顺序遍历,再按 addNetworkInterceptor() 设置的顺序遍历
- 如何解决线程冲突
- 保证线程安全,使用一些锁机制
- Java的垃圾回收机制
- 从GC roots遍历可达就说明有引用,不删除,其他删除
- 常见的算法有哪些?
- 标记清除,标准整理法,复制清除法
- Android里面常见的嵌套解决方法
- 不同方向的嵌套滑动
- ViewPage和RecyclerView嵌套,ScrollView嵌套RecyclerView
- 相同方向的嵌套滑动
- ScrollView嵌套ScrollView,NestedScrollView + RecyclerView
- 自定义的
- NestedScrollingParent和NestedScrollingChild
- Android 手势响应流程
- 当一个View接收到触摸事件后,它首先检查是否需要拦截这个事件,即判断是否要将事件交给自己处理。这个判断是在ViewGroup的onInterceptTouchEvent()方法中完成的。
- 在自己的onTouchEvent()方法中处理事件
- 手势检测,Android提供了GestureDetector类来帮助我们检测常见的手势并进行回调
- 如果出现事件冲突如何解决
- 外部拦截法 - 在父View中拦截事件,避免传递给子View
- 内部拦截法 - 先传递给子View,子View自己决定是否拦截
- 事件分发机制
感觉答的不是很好,刚刚睡醒,特别迷迷糊糊的,说话都不清晰,舌头打结!
最后面试官也没让手撕代码,说时间不太够了。反问了一下业务方向和技术方向
自己真的是太菜了,要学习的地方还很多的