当前位置: 首页 > article >正文

三方库总结

一、Glide

目标:熟练掌握各种使用方法,了解其设计,背后原理
如果我设计一个图片显示框架,我会怎么做?
1.加载图片资源-从网络上下载图片资源、从本地加载图片资源
如果是从网络上加载图片,需要用到相关的网络知识,更深一点,加载失败重试等策略的设置
2.用第一步拿到的图片资源展示图片
拿到图片资源,应该是转换成bitmap,然后使用相关的控件进行展示
更多的一些细节是比如图片的缓存策略,还有图片的加载展示怎么和页面生命周期保持一致
带着问题去读Glide源码及解析,问题如下:
1.Glide是怎么从网络上下载图片资源的,用的什么?怎么下载?有没有重试策略?
2.Glide拿到图片资源后是怎么做缓存的?缓存的是什么?会不会影响内存?什么时候缓存会被清理?
3.Glide是如何感知页面生命周期的?
总结博客:https://blog.csdn.net/Chushiniudao/article/details/130768974?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22130768974%22%2C%22source%22%3A%22Chushiniudao%22%7D

二、Okhttp
常用的操作就是Client.newCall(request).enqueue(),会调用Dispatcher.enqueue方法,Dispatcher是一个调度器,用于控制并发的请求,当异步请求队列数量小于64并且请求主机数小于5时,把请求加载到runningAsyncCalls中并在线程池中执行,否则加到readyAsyncCalls中进行缓存等待。
在一次请求结束后,会从readyAsyncCalls中取出下一个请求进行处理
在发起请求时,首先会检查处理拦截器设置(getResposeWithInterceptorChain),之后调用HttpEngine的sendRequest方法,如果有缓存会使用缓存,否则进行网络请求
复用连接池,ConnectionPool,用RealConnection来包装socket,通过引用计数法计算StreamAlloction来计算socket被引用的次数,如果为0则表示可以回收
几种拦截器:
1.重定向拦截器,会根据响应码做重定向和重试
2.桥接拦截器,将用户请求转换为对服务器的请求,将服务器的响应转换为给用户的响应,比如请求时如果有请求体,添加content-type、content-length;没有host,解析url取出host;没有user-agent,添加user-agent。响应时如果解析header的cookie,如果想要的格式gzip,则使用GzipSource进行解压
3.缓存拦截器,如果有缓存优先使用缓存
4.连接拦截器,进行连接的创建、复用和回收
5.读写拦截器,负责实现网络io,将header、body通过网络传输给服务器,对服务器的响应解析并构造出Response

Retrofit

使用注解和动态代理来解析处理请求,修饰方法的常用注解有get、post,方法参数类注解有@Path、@Query、@QueryMap(Get请求相关),post相关:@Field(传输数据类型为键值对)、@Body(传输数据类型为Json字符串);单个文件上传@Part,允许多个@Part,使用@Multipart修饰方法,@PartMap表示多个文件上传;添加消息报头,用@Header,比如接受的编码格式,user-agent等
源码:
首先Retrofit使用建造者模式来构建一个Retrofit对象,Retrofit.Builder构造函数里会获取Platform,根据不同的平台提供不同的线程池;构建retrofit对象时baseUrl是必须指定的,另外如果需要指定OkhttpClient对象的话,可以通过设置callFactory来完成;
Retrofit的流程是调用Retrofit对象的create方法,里面会通过动态代理,生成接口的对象,调用接口相关方法时会执行InvocationHandler里的invoke方法,首先会判断serviceMethod里是否有缓存,如果没有的话就创建一个ServeciMethod,里面会生成calladapter对象,获取返回的具体数据类型,遍历coverterfactory找到合适的数据转换工厂类,然后解析方法和参数注解,最后生成serviceMethod并缓存,然后创建一个OkHttpCall,传给serviceMethod.calladapter.adat方法,请求数据会执行enqueue方法,最后获取数据后会对接口响应数据进行转换,返回我们在方法生命的数据类型

LeakCanary

1.初始化:利用provider进行初始化,保证在application的attachBaseContext和onCreate之间初始化
2.添加相关监听对象的销毁监听:Activity、Fragment
3.收到销毁回调后,根据要回收对象创建KeyedWeakReference和ReferenceQueue,并关联(5s,两次检查,遍历queue,并从watchObjects中移除)
4.如果没有被回收就dump heap(有条件,比如位于前台时5个以上才转储堆,后台1个)
5.通过shark解析hprof文件,获取泄漏对象到gcroot的最短路径
6.合并多个泄漏路径并输出分析结果

项目难点:当时项目有三个表,消息表(0-1)、密友(>1)、未回复表(==0),每次收到消息后总要根据当前消息双方的亲密度将消息放入不同的表,因为收消息比较频繁,所以每次进行几个数据库表的查询更新插入操作就变得代价很大,
当时就考虑把三个表合成一个表,首先是在冷启动登陆成功时,会查询未回复表、密友表中的消息,然后转换为消息表消息的数据格式,然后插入消息表中,再删掉密友表和未回复表中的数据,然后在对应消息页、密友页、未回复页面,通过给定亲密度查询条件,查询对应的数据并展示;最后在收到消息后,根据将消息统一转换为消息表中的数据格式,插入或更新到消息数据表中;同时同步给服务器

阿里ARouter全面全面全面解析(使用介绍+源码分析+设计思路)_arouter init-CSDN博客

堆排序

公司认识了解  
 
个人发展规划:会沉淀技术,多去学习新技术的同时,研究技术的原理,并用技术赋能产品,提高产品的质量和用户使用体验


float  数组链表区别 配置修改活动重建恢复  个人规划  缺点  遇到什么困难的问题  

项目中难点,oom问题如何产生,怎么解决,内存泄漏都有哪些  api implemention compile区别

内存泄漏产生的几种场景:
1.静态变量持有大的对象
2.广播、EventBus注册未注销
3.Cursor、InputStream、OutputStream用完未关闭,Bitmap用完未回收
4.非静态内部类隐式持有外部类对象导致外部类对象无法被回收(典型如handler)
5.单例类持有activity、service对象,导致其无法正常销毁,使用弱引用包裹
6.webview内存泄漏,可以新开一个进程专门用于webview展示,使用aidl进行通信

可对可以讲的项目,照片墙播放videoview 全屏,轮播, 遇到的问题,怎么解决的,videoview第一次点击不暂停,第二次点击暂停,马甲包的配置开发流程,一些基础面试知识

照片墙轮播,可轮播照片、视频,照片3s自动轮播到下一张,视频播放完毕自动轮播到下一张,也可收到滑动轮播,可无限轮播,实现是data size*200,初始位置设在了10*data size  用到了videoview,有设置静音非静音选项(首次设置通过setOnPreparedListener回调里的mediaplayer完成,后续通过发射拿到mediaplayer完成设置),可暂停、播放视频,遇到的问题,从别的页面回来,发现无法轮播,因为轮播是在onpageselected回调里调用的,从别的页面回来如果当前离开时当前索引是第一张图片时,页面不会回调onPageSelect,故不能轮播,解决方法:离开时判断是第一张图片,则viewpager滑动到它的下一张图片;videoview第一次点击暂停无反应,第二次点击才能暂停,如果设置focusableInTouchMode属性的话,它的行为是首先尝试获得focus,如果获得成功的话其onClickListener是不会触发的,只有当你第2次再点击它时,才会执行onClickListener

intent 隐式跳转  action category data  intent中action只要匹配上activity intent-filter中action其中一个就行(data也是如此),category是intent中如果要指定category,那么必须是activity中intent-filter中配置的其中之一,不指定也没事,系统会自动加上DEFAULT category,所以如果activity要支持隐式跳转,必须在intent-filer中加上category(<category android:name="android.intent.category.DEFAULT"></category> );data由uri(scheme、host、port、path四部分)和mimetype组成,必须匹配上uri和mimetype才能算匹配上data
参考连接:https://blog.csdn.net/Leo_Liang_jie/article/details/92836838

singleTop适用于接收通知显示内容的页面,这样不会每点一个通知就创建一个新的页面;singleTask适用于app主页,app主页就能始终保持只有一个;singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离,不要用于中间页面,跳转会有问题

Android service使用场景,比如播放音乐,service创建完成后如果不主动停止或解绑,会一直在后台运行,而线程只要运行完毕就可能会被回收,因此service适合在后台处理一些不需要和用户交互的任务,如播放音乐;service还能和多个activity绑定通信,而线程不能;service具有生命周期,可以跨进程调用,通信;

架构能力-设计-如何设计一个好的架构-什么是好的架构-好的架构有什么特点-为什么架构好?解决了什么问题?优化了什么?

独立开发能力(app、sdk)-完整的开发app、sdk开发流程-如何开始-如何设计(要有架构能力,不然app、sdk可能只是能用,不过前期不用要求那么高)-如何测试-如何上线  

自动化测试能力-怎么自动化测试-

音视频能力-音视频开发到底在开发什么?-能做到什么?

网络能力-客户端需要掌握的网络开发技术有哪些?-为什么需要掌握这些?-掌握这些能有用来干什么-有哪些适用场景-网络框架是怎么实现的

手机系统认知能力-系统底层的运行原理-用到了哪些技术-为什么这么用,不那么用-有哪些是可以借鉴到应用层开发的

学习能力-新技术-新变动-能提高什么?还是只是新?

编码能力-随时写出想写的代码-就算是伪代码页可以-有思路-有设计-有逻辑-有细节

数据结构算法能力-时间空间复杂度-选用哪种数据结构-为什么选这种数据结构-这种数据结构有什么好处优势-都适用于什么场景

马甲包

组件化

插件化

滑动大图  

aidl

webview  


http://www.kler.cn/a/571416.html

相关文章:

  • 【Linux】【网络】UDP打洞-->不同子网下的客户端和服务器通信(成功版)
  • 鸿蒙与DeepSeek深度整合:构建下一代智能操作系统生态
  • 【leetcode hot 100 189】轮转数组
  • 从零开始学习Slam--数学概念
  • 《Operating System Concepts》阅读笔记:p180-p187
  • 蓝桥杯 2020 国赛 阶乘约数
  • 自学微信小程序的第十天
  • [liorf_localization_imuPreintegration-2] process has died
  • python全栈-Linux基础
  • 【Linux】进程信号——信号保存和信号捕捉
  • 【大模型】什么是蒸馏版大模型
  • 【零基础到精通Java合集】第二十三集:G1收集器深度解析
  • 鸿蒙5.0实战案例:基于ArkUI的透明页面效果
  • BambuStudio学习笔记:GCode 类
  • 15款单色颗粒渐变扭曲抽象艺术背景图AI/PSD格式设计素材 Abstract Grainy Gradient Background
  • CubeMX创建STM32F407工程
  • DeepSeek未来发展趋势:开创智能时代的新风口
  • Ubuntu20.04双系统安装及软件安装(十三):录屏软件kazam
  • wpa_supplicant源码剖析-main.c解析
  • 【微知】如何通过mlxlink查看Mellanox网卡和光模块相关的信息?( mlxlink -d 01:00.0 -m)