美文网首页
Retrofit+hashmap+热修复(面试题06)

Retrofit+hashmap+热修复(面试题06)

作者: 小慧sir | 来源:发表于2019-11-30 11:46 被阅读0次

    1.Retrofit作用和原理
    Retrofit并不做网络请求,只是生成一个能做网络请求的对象。
    Retrofit的作用是按照接口去定制Call网络工作对象
    网络请求的目标虽然是数据,但是我们需要为这个数据写大量的配套代码,发起请求的对象Call,接收数据的对象CallBack,做数据转换的对象Converter,以及检查和处理异常的对象等。
    这对于一个项目的开发、扩展和维护来说,都是成本和风险。
    而Retrofit做的事情,就是为开发者节省这部分的工作量,Retrofit一方面从底层统一用OkHttp去做网络处理;另一方面在外层灵活提供能直接融入业务逻辑的Call网络访问对象。
    具体来说,Retrofit只负责生产对象,生产能做网络请求的工作对象,他有点像一个工厂,只提供产品,工厂本身不处理网络请求,产品才能处理网络请求。

    retrofit扩展
    a) OkHttpClient
    Retrofit使用OkHttpClient来实现网络请求,这个OkHttpClient虽然不能替换为其他的网络执行框架比如Volley,但是Retrofit允许我们使用自己扩展OkHttpClient,一般最常扩展的就是Interceptor拦截器了
    b) addConverterFactory
    扩展的是对返回的数据类型的自动转换,把一种数据对象转换为另一种数据对象。
    在上述场景中,GsonConverterFactory可以把Http访问得到的json字符串转换为Java数据对象BizEntity,这个BizEntity是在INetApiService接口中要求的的。
    这种转换我们自己也经常做,很好理解。
    如果现有的扩展包不能满足需要,可以继承Retrofit的接口。retrofit2.Converter<F,T>,自己实现Converter和ConverterFactory。
    在创建Retrofit对象时,可以插入我们自定义的ConverterFactory。
    c) addCallAdapterFactory
    扩展的是对网络工作对象callWorker的自动转换,把Retrofit中执行网络请求的Call对象,转换为接口中定义的Call对象。

    retrofit 实现原理
    a) 动态代理
    b) 适配转换call对象
    c) 函数解析、网络请求和数据转换
    d)整体结构与分工实现

    2.热修复
    热修复即”打补丁“,当一个app上线后,如果发现重大的bug,需要紧急修复。常规的做法是修复bug,然后重新打包,再上线到各个渠道。这种方式的成本高,效率低。于是热修复技术应运而生,热修复技术一般的做法是应用启动的时候,主动去服务端查询是否有补丁包,有就下载下来,并在下一次启动的时候生效,这样就可以快速解决线上的紧急bug。

    热修复原理
    代码修复的原理主要是类替换。类的替换就涉及到ClassLoader的使用,Android中可用来动态加载代码的ClassLoader有PathClassLoader、DexClassLoader。因为PathClassLoader在Dalvik虚拟机中只能用来加载已安装apk的类,而DexClassLoader在Dalvik和ART虚拟机中都能加载未安装apk或者dex中的类,所以热修复使用DexClassLoader来加载补丁包中的类。
    
    通过遍历DexPathList的dexElements数组进行类的查找加载,当找到类就返回;dexElements数组的每个元素都代表着一个dex文件,所以为了让补丁包中要替换的类抢先于有bug的类被加载,就需要将补丁包dex插入到dexElements数组的头部。
    

    3.hashmap
    HashMap是数组加链表组成的一种数据结构,java1.8之前实现的方式是数组+链表,1.8之后改为数组+链表+红黑树。HashMap有四种构造函数,有默认的构造函数,指定容量大小和负载因子大小,以及传入一个map集合,然后把集合中的全部元素添加进hashmap中。HashMap默认的数组长度是16,负载因子默认0.75。数组是HashMap的主体,链表主要解决存储数据的生活的哈希冲突。如果定位到的数组位置不含链表,那么查找和添加等操作都很快一次寻址就完成,如果定位到的数组包含链表,对于添加操作,首先是遍历链表,存在即覆盖,否则新增,对于查找操作来讲,仍需要遍历链表,然后通过key对象的equals方法逐一对比查找。插入和查询数据的时候通过传入的对象获取其hash值,通过hash值查看对应的数组索引位置有没有值,如果没有值就创建一个对应的链表,存入该数据的索引位置,如果当前位置是红黑树,就把数据插入到红黑树里面。链表插入数据以后如果长度达到8,就转换成红黑树。最后判断数组是否超过阈值就需要扩容。

    相关文章

      网友评论

          本文标题:Retrofit+hashmap+热修复(面试题06)

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