2018.09.10复习面试记录

本文详细解析了Android中Activity的启动过程,涉及跨进程通信、权限管理、大图加载优化方案及网络协议TCP/UDP的工作原理。此外,还介绍了线程池的使用场景与RxJava在异步编程中的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity的启动过程

https://hawksjamesf.github.io/blog/2018-03-15/framework-service-ams-component

  从Context的startActivity说起,其实现是ContextImpl的startActivity,然后内部会通过Instrumentation来尝试启动Activity,这是一个跨进程过程,它会调用ams的startActivity方法,当ams校验完Activity的合法性后,会通过ApplicationThread回调到我们的进程,这是一个跨进程的过程,而ApplictionThread就是一个Binder.回调逻辑就是在Binder线程池中完成,所以需要通过Handler H将其切回UI线程,第一个消息是LAUNCH_ACTIVITY,对应着handleLaunchActivity,在这个方法里面完成了Activity的创建和启动,接着,在Activity的onResume中,Activity的内容将开始渲染到Window上面,然后开始绘制,直到我们可见。

 

Android的权限

涉及到的方法:checkSelfPermission() 主要功能检查权限

      RequestPermissions:主要功能申请权限

       ShouldShowRequestPermissionRationale()

       onRequestPermissionResult()

 

Android中大图加载问题?

1.0图片采样率缩放:将图片按照一定比例缩放,降低分辨率,从而减少内存占用,具体用到BitmaoFactory.Options对象。

2.0利用BitmapRegionDecoder加载图片的一部分。(不仅不出现OOM,也不压缩)

BitmapRegionDecoder

 

 

网络协议=====TCP/UDP、TCP三次握手和四次挥手

应用层:http/ftp

网络层:IP

传输层:TCP/UDP

第一次握手:客户端向服务端发送报文,报文中设置标志位,生成随机序列号,客户端进入syn_sent状态。

第二次握手:服务端收到客户端报文,知道客户端请求建立连接,服务端给客户端发送报文,

第三次握手:客户端收到服务器的报文,检查ack标记位,并发送给服务端,服务端检查标记位,如果正确连接建立成功。完成三次握手

 

 

 

第一次挥手:客户端发送报文,标记位此时客户端进入fit wait状态,表示客户端没有数据发送给服务端

第二次挥手:服务端收到客户端发送的fit报文,然后给客户端发送一个报文,设置标志位,确认序列号,服务端进入close wait状态,表示客户端到服务端的发送连接断开。

第三次挥手:服务器发送报文到客户端,用来关闭服务器

第四次挥手:客户端收到服务器发送的标志位为 FIN 的报文,客户端进入到 CLIENT_WAIT 状态,等待2MSL时间。然后发送一个标志位为 ACK = 1 的报文,确认序列号为 Ack = m+1 。完成四次挥手

线程池相关的问题?

为什么使用线程池?提高资源利用,减少重复创建线程,提高响应速度,具有可管理性(对当前的线程进行优化处理,减少创建和销毁线程带来的开销)

线程分类:四个构造:

1.0FixedThreadPool:线程数量固定的线程池,当线程处于空闲状态也不会回收,当所有线程是活动状态,会等待。

2.0CachedThreadPool线程数量不等的线程池,只有非核心的线程,当数量很大时候,新的任务进来,就会创建新的线程,超时60秒

3.0ScheduledThreadPool:核心线程数量固定,非核心线程没有限制,用于执行定时任务和具有周期性的任务。

4.0SingleTrheadExecutor:只有一个核心线程,所有任务在一个线程中按照顺序执行,处理了线程同步。公测先来先上。

 

 

我整理了下,RxJava的主要作用如下: 1. 线程切换 2. 网络请求,本地数据等的数据源组合起来的处理 3. 将嵌套调用改为链式调用,流程更加清晰 但是,这个框架有9000+的方法数,有0.6M的包体积,还有众多操作符的学习成本。我感觉我以上说的主要作用,不足以弥补它在框架体积和学习成本上的缺点。但是为什么还是那么多人说这个框架好呢?请问,RxJava真正的优点在哪里? 个人理解 经过反复的思考,我认为“RxJava的应用场景到底在哪里?的答案,应该到什么是Rx”里找?先弄清楚什么是Rx”,然后再思考RxJava可以给我们的项目带来什么好处? Rx是什么:Rx是一个基于响应式编程思想实现的函数库,让开发者可以利用可观察序列和LINQ风格查询操作符来编写异步和基于事件的程序(可以这样定义:Rx=Observable + LINQ + Schedule 因此,RxJava的应用场景其实应该从其特点(Observable-事件,LINQ-链式操作符,Schedule-线程,响应式编程)出发。能够发挥其特点帮助开发者更快速高效的进行开发的场景,就是RxJava的应用场景。 应用RxJava的目的: 1. 项目中,存在大量复杂的操作(包括UI反馈,网络请求等)。这些操作会引出一连串业务处理(包括UI刷新,DB处理等),通过RxJava将操作转化为Observable,再通过响应式编程链式调用来实现业务,可以让业务处理的流程更加清楚,改动业务更灵活。 2. RxJava提供了大量操作事件的操作符,这些操作符的功能涵盖了项目开发中大部分的应用场景,使用这些操作符API,可以减少开发成本,事半功倍。 3. RxJava提供了方便的线程切换操作,切换线程不再需要用到Handler之类的操作了。加大开发效率,提升代码清晰度。

 

 

https://www.jianshu.com/p/e27672dd52de?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weixin&from=groupmessage

 

 

 

 

https://jekton.github.io/

 

 

 

 

RXJAVA

https://www.jianshu.com/p/031745744bfa

https://gank.io/post/560e15be2dca930e00da1083

https://www.jianshu.com/p/a9ebf730cd08

 

 

自定义View的绘制,SurfaceView的原理,view的onMeasure、onLayout和onDraw的方法执行意义等。还有关于手势事件的分发机制和滑动冲突的处理。其他的一些系统常用控件的源码分析也很必要,比如ListView和RecyclerView的区别缓存机制、viewPager的页数缓存实现原理



视频学习地址:http://v.qq.com/vplus/56c7ec6c231bdbafd198c58fb86eb4dc/videos

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值