Android⾯试题(六)2⽹络与安全机制(1)
⼋、⽹络与安全机制
6.1 ⽹络框架对⽐
volley:
功能
基于HttpUrlConnection;封装了UIL图⽚加载框架,⽀持图⽚加载;⽹络请求的排序、优先级处理缓存;多级别取消请求;Activity和⽣命周期的联动(Activity结束⽣命周期同时取消所有⽹络请求
性能
可拓展性好;可⽀持HttpClient、httpUrlConnection、和okhttp
开发者使⽤
封装⾏好,简单易⽤
应⽤场景
合轻量级⽹络交互:⽹络请求频繁,传输数据量⼩;不能进⾏⼤数据量的⽹络操作,⽐如⾳频下载⽂件传输
备注
Volley的request和response都是把数据放到byte数组⾥,不⽀持输⼊输出流,把数据放到数组中,如果⽂件多了,数组就会⼤,消耗内存
okhttp:
功能
android retrofit
⾼性能Http请求库;可以把它理解成是⼀个封装之后类似HttpUrlConnection的⼀个东西,属于同级别并不是基于前者;⽀持SPDY,共享同⼀个Socket来处理同⼀个服务器所有的请求;⽀持http2.0、websocket;⽀持同步、异步;封装了线程池、数据转换、参数使⽤、错误处理等;⽆缝的⽀持GZIP来减少数据流量;缓存响应数据来减少重复的⽹络请求;能从很多常⽤的连接问题中⾃动恢复;解决了代理服务器问题和SSL握⼿失败问题
性能
基于NIO和OKio,所以性能更⾼,请求、处理速度快(io:阻塞式;NIO:⾮阻塞式;)
开发者使⽤
api调⽤简单⽅便;使⽤需要多封装⼀层
应⽤场景
重量级⽹络交互场景:⽹络请求频繁,传输数据量⼤
备注
Android4.4源码中,HttpUrlConnection已经替换成OkHttp
retrofit:
功能
RESRful Api设计风格;⽀持同步、异步;通过注解配置请求;包括请求⽅法、请求参数、请求头、返回值等;可以搭配多种Converter将获得的数据解析&序列化;⽀持Gson(默认)、Jackson、Protobuf等;提供对RxJava的⽀持
性能
简单易⽤;代码简化;解耦彻底,职责细分;易与和rxjava使⽤;使⽤⽅法较多,原理复杂,
开发者使⽤
简单易⽤;代码简化;解耦彻底,职责细分;易与和rxjava使⽤;使⽤⽅法较多,原理复杂
应⽤场景
重量级⽹络交互场景:⽹络请求频繁,传输数据量⼤
备注
Android4.4源码中,HttpUrlConnection已经替换成OkHttp
6.2 android 设计⼀个简易的Http⽹络请求框架
最近项⽬中需要⽤到版本升级这⼀块,需要⽤到⼀些基本的数据请求与⽂件下载功能。之前做项⽬都是⽤别⼈的⽹络框架,类似retrofit 、okhttp、 fresco等框架,⽤的多了,发现这⼏个⽹络请求框架,⽆⾮都是
按解决以下⼏个问题为导向的:
1.怎么发请求?
2.Cookie的问题。
3.如何停⽌请求(好像上⾯提到的⼏个框架没有停⽌请求的概念,因为停⽌请求常⽤⽤SOcket长连接协议中,⽽http是短连接,只要触发了请求,就失去了控制⼀样。)
4.请求的并发?
5.如何管理请求的优先级(类似http这种协议请求,⼏乎可以忽略,请求的优先级常⽤于socket协议中)
6.3 OkHttp源码分析
简述okhttp的执⾏流程:
1. OkhttpClient 实现了Call.Fctory,负责为Request 创建 Call;
2. RealCall 为Call的具体实现,其enqueue() 异步请求接⼝通过Dispatcher()调度器利⽤ExcutorService实现,⽽最终进⾏⽹络请求
时和同步的execute()接⼝⼀致,都是通过 getResponseWithInterceptorChain() 函数实现
3. getResponseWithInterceptorChain() 中利⽤ Interceptor 链条,责任链模式 分层实现缓存、透明压缩、⽹络 IO 等功能;最终将
响应数据返回给⽤户。
6.4 从⽹络加载⼀个10M的图⽚,说下注意事项
我们⾸先获得⽬标View所需的⼤⼩,然后获得图⽚的⼤⼩,最后通过计算屏幕与图⽚的缩放⽐,按照缩放⽐来解析位图。
具体步骤如下:
1. 将BitmapFactory.Options的inJustDecodeBounds参数设为true并加载图⽚
2. 从BitmapFactory.Options中取出图⽚的原始宽⾼信息,他们对应于outWidth和outHeight参数
3. 根据采样率的规律并结合⽬标View的所需⼤⼩计算出采样率inSampleSize
4. 将BitmapFactory.Options的inJustDecodeBounds参数设为false,然后重新加载图⽚
两个⽅法⽐较重要,在这⾥我们进⾏解析:
options.inJustDecodeBounds:如果给它赋值true,那么它就不会解析图⽚。使⽤它的⽬的是为了获得图⽚的⼀些信息,如图⽚⾼度和宽度,然后进⾏下⼀步⼯作,也就是计算缩放⽐。将options.inJustDecodeBounds设置为false,将会加载图⽚。
options.inSampleSize :给图⽚赋予缩放⽐,当它的值⼤于1的时候,它就会按照缩放⽐返回⼀个⼩图⽚⽤来节省内存。
除了因为图⽚⼤⼩⾃⾝的原因之外,还有Android对图⽚解码的因素在内。
在Android中使⽤ARGB来展⽰颜⾊的,⼀般情况下使⽤的是ARGB_8888,每个像素的⼤⼩约为4byte。如果对质量不做太⼤要求,可以使⽤ARGB_4444或者RGB_565,他们都是2个字节的。
如果图⽚涉及到放⼤功能,则也需要注意以下事项:
1.图⽚分块加载:
图⽚的分块加载在地图绘制的情况上最为明显,当想获取⼀张尺⼨很⼤的图⽚的某⼀⼩块区域时,就⽤到了图⽚的分块加载,在Android中BitmapRegionDecoder类的功能就是加载⼀张图⽚的指定区域。BitmapRegionDecoder类的使⽤⾮常简单,API很少并且⼀⽬了然,如下:
(1)创建BitmapRegionDecoder实例
(2)获取图⽚宽⾼
(3)加载特定区域内的原始精度的Bitmap对象
(4)调⽤BitmapRegionDecoder类中的recycle(),回收释放Native层内
2.使⽤LruCache
继承并使⽤LruCache,利⽤其来缓存加载过的图⽚区域,需要重写⼀些⽅法,如sizeOf()、entryRemoved()等
其中sizeOf()⽤于处理获取缓存对象的⼤⼩,⽐如缓存Bitmap对象时,可以使⽤Bitmap的字节数作为Bitmap⼤⼩的表⽰。
entryRemoved()⽤于回收某个对象时调⽤,这样当回收Bitmap对象时可以调⽤Bitmap对象的recycle()⽅法主动释放Bitmap对象的内存。
3.⼿势处理:
主要⽤到两个⼿势处理类,分别是ScaleGestureDetector和GestureDetector,前者⽤于处理缩放⼿势,后者⽤于处理其余⼿势,如移动,快速滑动,点击,双击,长按等。
ScaleGestureDetector专门处理缩放⼿势,其⽐较重要的⽅法是onScale(ScaleGestureDetector detector),当缩放时会不停地回调这个⽅法,需要注意的⼀点是ScaleFactor()获取到的缩放⽐例是相对上⼀次的
6.5 TCP的3次握⼿和四次挥⼿
三次握⼿过程理解
第⼀次握⼿:建⽴连接时,客户端发送syn包(syn=x)到服务器,并进⼊SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第⼆次握⼿:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时⾃⼰也发送⼀个SYN包(syn=y),即SYN+ACK包,此时服务器进⼊SYN_RECV状态;
第三次握⼿:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进⼊ESTABLISHED(TCP连接成功)状态,完成三次握⼿。
四次挥⼿过程理解
1)客户端进程发出连接释放报⽂,并且停⽌发送数据。释放数据报⽂⾸部,FIN=1,其序列号为seq=u(等于前⾯已经传送过来的数据的最后⼀个字节的序号加1),此时,客户端进⼊FIN-WAIT-1(终⽌等待1)状态。 TCP规定,FIN报⽂段即使不携带数据,也要消耗⼀个序号。
2)服务器收到连接释放报⽂,发出确认报⽂,ACK=1,ack=u+1,并且带上⾃⼰的序列号seq=v,此
时,服务端就进⼊了CLOSE-WAIT(关闭等待)状态。TCP服务器通知⾼层的应⽤进程,客户端向服务器的⽅向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续⼀段时间,也就是整个CLOSE-WAIT状态持续的时间。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。