美文网首页
面试笔记

面试笔记

作者: yqianqiao | 来源:发表于2022-03-17 15:06 被阅读0次

    面试笔记

    一、Okhttp

    拦截器 作用
    应用拦截器 拿到的是原始请求,可以添加一些自定义header、通用参数、参数加密、网关接入等等
    RetryAndFollowUpInterceptor 处理错误重试和重定向
    BridgeInterceptor 应用层和网络层的桥接拦截器,主要工作是为请求添加cookie、添加固定的header,比如Host、Content-Length、Content-Type、User-Agent等等,然后保存响应结果的cookie,如果响应使用gzip压缩过,则还需要进行解压。
    CacheInterceptor 缓存拦截器,如果命中缓存则不会发起网络请求。
    ConnectInterceptor 连接拦截器,内部会维护一个连接池,负责连接复用、创建连接(三次握手等等)、释放连接以及创建连接上的socket流。
    networkInterceptors(网络拦截器) 用户自定义拦截器,通常用于监控网络层的数据传输。
    CallServerInterceptor 请求拦截器,在前置准备工作完成后,真正发起了网络请求。

    设计模式:

    1. 构建者模式:OkHttpClientRequest的构建都用到了构建者模式

    2. 外观模式: OkHttp使用了外观模式,将整个系统的复杂性给隐藏起来,将子系统接口通过一个客户端OkHttpClient统一暴露出来

    3. 责任链模式: OKHttp的核心就是责任链模式,通过5个默认拦截器构成的责任链完成请求的配置

    4. 享元模式: 享元模式的核心即池中复用,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发送到对应的线程中去

    问题:

    1. 为什么不同handler能找到自己对应的方法?

      答:因为在发送消息的时候,会把handler本身赋值给Message,在Looper里面取得时候会调用msg.target.dispatchMessage(msg)方法,而线程切换本质就是看looper在哪个线程启动的

    四、LiveData 粘性事件:即发射的事件如果早于注册,那么注册之后依然可以接收到的事件称为粘性事件

    解决:通过反射mLastVersion>=mVersion修改,使它俩值相等,就不会触发onChanged回调了

    五、view的绘制流程

    activity.setContentView()->AppCompatDelegateImpl.setContentView()->PhoneWindow.installDecor()创建DecorView,设置标题主题等,添加默认布局

    四、协程 定义:

    • 协程是一种在程序中处理并发任务的方案;也是这种方案的一个组件。

    • 协程和线程属于同一层级的概念。

    • 协程不存在并行

    相关文章

      网友评论

          本文标题:面试笔记

          本文链接:https://www.haomeiwen.com/subject/jvrxqrtx.html