面试笔记
一、Okhttp
拦截器 | 作用 |
---|---|
应用拦截器 | 拿到的是原始请求,可以添加一些自定义header、通用参数、参数加密、网关接入等等 |
RetryAndFollowUpInterceptor | 处理错误重试和重定向 |
BridgeInterceptor | 应用层和网络层的桥接拦截器,主要工作是为请求添加cookie、添加固定的header,比如Host、Content-Length、Content-Type、User-Agent等等,然后保存响应结果的cookie,如果响应使用gzip压缩过,则还需要进行解压。 |
CacheInterceptor | 缓存拦截器,如果命中缓存则不会发起网络请求。 |
ConnectInterceptor | 连接拦截器,内部会维护一个连接池,负责连接复用、创建连接(三次握手等等)、释放连接以及创建连接上的socket流。 |
networkInterceptors(网络拦截器) | 用户自定义拦截器,通常用于监控网络层的数据传输。 |
CallServerInterceptor | 请求拦截器,在前置准备工作完成后,真正发起了网络请求。 |
设计模式:
-
构建者模式:
OkHttpClient
与Request
的构建都用到了构建者模式 -
外观模式:
OkHttp
使用了外观模式,将整个系统的复杂性给隐藏起来,将子系统接口通过一个客户端OkHttpClient
统一暴露出来 -
责任链模式:
OKHttp
的核心就是责任链模式,通过5个默认拦截器构成的责任链完成请求的配置 -
享元模式: 享元模式的核心即池中复用,
OKHttp
复用TCP
连接时用到了连接池,同时在异步请求中也用到了线程池
二、Retrofit
img三、handler
-
handler
:消息机制中作为一个对外暴露的工具,其内部包含了一个Looper
。负责发送消息与处理消息。 -
Looper
:作为消息循环的核心,其内部包含了一个消息队列MessageQueue
,用于记录所有待处理的消息。通过Looper.loop()
不断地从MessageQueue
中抽取Message
。线程切换就是在这步完成的。 -
MessageQueue
:消息队列,本质是单项链表。等待Looper
的抽取 -
Message
:消息体,内部包含target
,就是最终处理它的Handler
,在handler
发送消息时的enqueueMessage()
方法中赋值。线程切换的本质就是,需要在哪个线程处理handler,就在哪个线程创建Looper,而不管handler在哪个线程发送消息, 最终都是存储到handler里面的Looper上的MessageQueue,再通过Looper.loop()里面的for循环来通过msg里面绑定的 handler引用,调用对应的handler.dispatchMessage()
流程:activity里面创建handler不需要Looper.loop()。而子线程需要,是因为主线程在ActivityThread里面调用了。 然后创建好handler发送消息,不管是正常发送还是延迟发送,最终都会调用enqueueMessage(),里面将本身handler赋值到msg.target, 并将这个msg存储到Looper里的MessageQueue。 Looper里面有ThreadLocal,它是线程隔离,每个线程里面绑定着一个Looper,它get没有取到会抛异常 Looper.loop()方法是一个死循环,不断的读取里面的MessageQueue,再通过它里面的target。就是发消息时候绑定的handler,调用 dispatchMessage将msg发送到对应的线程中去
问题:
-
为什么不同handler能找到自己对应的方法?
答:因为在发送消息的时候,会把handler本身赋值给Message,在Looper里面取得时候会调用
msg.target.dispatchMessage(msg)
方法,而线程切换本质就是看looper在哪个线程启动的
四、LiveData 粘性事件:即发射的事件如果早于注册,那么注册之后依然可以接收到的事件称为粘性事件
解决:通过反射mLastVersion>=mVersion修改,使它俩值相等,就不会触发onChanged回调了
五、view的绘制流程
activity.setContentView()->AppCompatDelegateImpl.setContentView()->PhoneWindow.installDecor()创建DecorView,设置标题主题等,添加默认布局
四、协程 定义:
-
协程是一种在程序中处理并发任务的方案;也是这种方案的一个组件。
-
协程和线程属于同一层级的概念。
-
协程不存在并行
网友评论