Android知识点总结(2021)
⼀、 Java基础
1、集合
1.1 List(有序、可重复)
List⾥存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有⼀系列和索引相关的⽅法,查询速度快。查询效率⾼,删除与插⼊效率低,会引起元素位置变化;
android retrofit(1) ArrayList 基于动态数组的数据结构,查改效率⾼, 增删效率低;
(2) LinkedList 基于双向循环链表实现,增删操作效率更⾼,⽽查改操作效率较低;
(3) Vector 跟ArrayList相似,线程安全;
1.2 Set(⽆序、不能重复)
Set⾥存放的对象是⽆序,不能重复的,集合中的对象不按特定的⽅式排序,只是简单地把对象加⼊集合中。删除和插⼊效率⾼,不会引起元素位置变化
(1) HashSet 不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,最多⼀个;
(2) ThreeSet 可以实现排序等功能,底层是⼆叉树
1.3 Map(键值对、键唯⼀、值不唯⼀)
Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set 集合进⾏遍历,得到相应的值。
(1) HashMap 根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据
的顺序是完全随机的。因为键对象不可以重复,所以HashMap最多只允许⼀条记录的键为Null,允许多条记录的值为Null,是⾮同步的
(2) TreeMap 实现SortMap接⼝,能够把它保存的记录根据键排序,默认是按键值的升序排序(⾃然顺序),也可以指
定排序的⽐较器,当⽤Iterator遍历TreeMap时,得到的记录是排过序的。不允许key值为空,⾮同步的;
2、继承
从已有的类中派⽣出已有的类,继承来的类能吸收已有类的⾮私有属性和⽅法(⾏为),并能扩展新的属性和⽅法。通俗来说,继承就是分为了⽗类和⼦类,⽗类有时也成为超类(super class),⼦类⼜成为派⽣类;⼦类继承了⽗类的属性和⽅法,并且具有了⽗类所没有的。
4.1 限制
(1)Java的继承只能是单继承,⼀个⼦类只能继承⼀个⽗类;
(2)Java的继承允许多层继承,即⼦类⼜是另⼀个类的⽗类(可以理解 为爷爷、爸爸与⼉⼦的关系);
3、多态
指⽗类的某个⽅法被⼦类重写时,可以产⽣⾃⼰的功能⾏为,同⼀个操作 作⽤于不同对象,可以有不同的解释,产⽣不同的执⾏结果。
5.1 三个必要条件:继承⽗类、重写⽗类的⽅法和⽗类的引⽤指向⼦类对象;
5.2 作⽤:消除类型之间的耦合关系, 多个⽅法在不同对象执⾏不同的结果;
4、接⼝
是抽象类的延伸,它允许⼀个类可以实现多个接⼝,弥补了抽象类不能多继承的缺陷,接⼝是对类的描述,使⽤ interface 关键字来声明。5、线程池--待补充
⼆、 Koltin基础
kotlin语⾔更简单。能减少代码的冗余以及⼀些Java不⽀持的特性
独有的特性:
1.空指针安全
2.操作符重载
3.协程
4.Range 表达式
5.智能转换
6.伴随体
优势:
数据类型 toString, hashcode, equals Setter 和getter都省略
Kotlin⽀持扩展函数
空指针安全
⾃带单例(object)
劣势:
没有检查异常、原始类型、 静态成员、 ⾮私有字段、 通配符类型、 三元操作符;
没有明显意义的关键字( internal, crossinline, expect, reified, sealed, open);
Kotlin有没有static 关键字,⽤伴随体代替;
协程
协程是轻量级线程,创建协程不需要分配新的线程,相反,它使⽤已经定义好的线程池,智能调度。此外,协程可以挂起和恢复;
三、 Android
各⼤版本之间的特点:
android 5.0 Material Design视觉⼯具包、锁屏显⽰通知
android 6.0 动态权限、⽂本选择(剪切、复制、全选)
android 7.0 应⽤分屏、通知栏快捷回复
android 8.0 画中画(视频⼩窗⼝)、⾃适应图标(圆形或⽅形)
android 9.0 刘海屏、凹凸屏的适配和多摄像头⽀持
android 10 可折叠设备⽀持、5G⽹络、设备标识码和地理位置权限
3.1 ⽹络请求
1. ⽹络
1.1 HTTP与HTTP协议
Get不能⼤于2kb,执⾏效率⾼,不太安全;Post⽆限制,执⾏效率低,更安全;
执⾏效率低的原因是Post需求组装键值对放⼊header中,get直接拼接即可;
1.2 Okhttp
它内部实现通过⼀个责任链模式完成,将⽹络请求的各个阶段封装到各个链条中,实现了各层的解耦。
1.3 Retrofit2更详细的参考
它并不是⽹络请求框架,严格说只是对⽹络请求的⼀种封装,我们只需要定义⼀个接⼝类,在请求⽅法上加上相应的注解,甚⾄都不需要实现,就可以实现⽹络请求。
3.2 开发模式
(1) MVC
Model:针对业务模型建⽴的数据结构和类(与View⽆关,只与业务相关)
View:XML/JAVA或者JS+HTML进⾏页⾯的显⽰。Activity/Frgament也承担了View的功能。
Controller:Android的控制层通常在Activity、Fragment之中。本质就是Controller操作Model层的数据,并且将数据返回给View层展⽰。
缺点:View层和Model层互相耦合,耦合过重,代码量过⼤,不易于开发和维护。
(2) MVP
Model:对数据和⽹络等的操作,主要提供数据的存储功能。Presenter需要通过Model存取数据。
View: 负责处理点击事件和视图展⽰(Activity、Fragment或者某个View控件)
Presenter: View和Model之间的桥梁,从Model检索数据后返回给View层。使得M/V之间不再有耦合关系。
缺点: view层和presenter层,如果有⼀个逻辑很复杂的页⾯,接⼝会有很多,导致维护接⼝的成本⾮常⼤,解决⽅案是尽可能将⼀些通⽤的接⼝作为基类,其他的接⼝去继承。
(3) MVVM
View:对应于Activity和XML,负责View的绘制以及与⽤户交互,它是不能做任何与业务相关的操作。
Model:实体模型,这跟咱们平常定义的Model层是不⼀样的。
ViewModel:负责完成View与Model之间的交互,负责业务逻辑。它不能做任何与UI相关的操作,也就是不能持有任何View的引⽤。
ViewModel和Model/View进⾏了双向绑定。
View发⽣改变时,ViewModel会通知Model进⾏更新数据,Model数据更新后,ViewModel会通知View更新显⽰。⽀
持库Data Binding:能将数据绑定到xml中,现在⼜引⼊了ViewModel和LiveData组件⽤于更⽅便的实现MVVM
3.3 图⽚压缩
(1) 常规压缩
①质量压缩
在保持像素的前提下改变图⽚的位深及透明度(即:通过算法抹掉(同化)图⽚中的⼀些某点附近 相近的像素)达到降低质量压缩⽂件的⽬的。
②尺⼨压缩
通过减少单位尺⼨的像素值,真正意义上的降低像素(通过缩放图⽚像素来减少图⽚占⽤内存⼤⼩)
③采样率压缩
设置图⽚的采样率,降低图⽚像素。好处是不会先将⼤图⽚读⼊内存,⼤⼤减少了内存的使⽤,也不必考虑将⼤图⽚读⼊内存后的释放事宜。 带来的问题是因为采样率是整数,所以不能很好的保证图⽚的质量。如我们需要的是在2和3采样率之间,⽤2的话图⽚就⼤了⼀点,但是⽤3的话图⽚质量就会有很明显的下降,这样也⽆法完全满⾜我的需要。
④通过JIN调⽤libjpeg库压缩
绕过Android Bitmap API层,⾃⼰编码实现—-修复使⽤哈夫曼算法。
(2). 鲁班压缩
① 核⼼⽅法就是thirdCompress(File file),即如何计算得出理想的压缩后宽⾼,以及图⽚⼤⼩;
② 不⾜之处: 不能很好的⽀持多图⽚压缩,会产⽣OOM;与RxJava强耦合。
3.5 ⾃定义View
View的绘制流程 和 步骤
3.6 事件分发
基本会遵从 Activity => ViewGroup => View 的顺序进⾏事件分发,然后通过调⽤ onTouchEvent() ⽅法进⾏事件的处理。我们在项⽬中⼀般会对
MotionEvent.ACTION_DOWN,MotionEvent.ACTION_UP,MotionEvent.ACTION_MOVE,MotionEvent.ACTIO N_CANCEL 分情况进⾏操作
3.7 性能优化
(1) 启动优化: Application中不要做⼤量耗时操作,如果必须的话,建议异步做耗时操作
(2) 布局优化:使⽤合理的控件选择,少嵌套。(合理使⽤include,merge,viewStub等使⽤)
(3) Apk优化(资源⽂件优化,代码优化, lint检查,.9.png, 合理使⽤shape替代图⽚,webp等)
(4) ⽹络优化,电量优化
避免轮询,尽量使⽤推送。
应⽤处于后台时,禁⽤某些数据传输
限制访问频率,失败后不要⽆限重连
选⽤合适的定位服务(GPS定位,⽹络定位,被动定位)
使⽤缓存
startActivityForResult替代发送⼴播
(5) 内存优化
循环尽量不使⽤局部变量
避免在onDraw中创建对象,onDraw会被频繁调⽤,容易造成内存抖动。循环中创建⼤的对象,也是如此。
不⽤的对象及时释放
数据库的cursor及时关闭
Adapter使⽤缓存
注册⼴播后,在⽣命周期结束时反注册
及时关闭流操作
图⽚尽量使⽤软引⽤,较⼤的图⽚可以通过bitmapFactory缩放后再使⽤,并及时recycler。另外加载巨图时不要 使⽤setImageBitmap或setImageResourse或BitmapFactory.decodeResource,这些⽅法拿到的都是bitmap的对象,占⽤内存较⼤。可以⽤BitmapFactory.decodeStream⽅法配合BitmapFactory.Options进⾏缩放
避免static成员变量引⽤资源耗费过多实例
避免静态内部类的引⽤
3.8 异常问题
(1) OOM
out of memory 内存溢出 。
每个进程能够⽀配的内存是有限的,所以资源要记得使⽤完及时释放,如果未释放,就有可能造成内存泄漏,内存泄漏达到⼀定程度 ⼿机就会造成内存溢出。
内存泄漏和内存溢出是不同的,但是过多的内存泄漏会导致内存溢出。
内存溢出的根本原因:
1.应⽤申请内存的速度超过了gc内存回收的速度。
2.应⽤申请的内存⼤⼩超过了⼿机的可⽤内存。
常见根因:
1.加载超⼤的图⽚、⽂件
2.创建⼤量的对象
优化⽅法:
1.申请更⼤的内存,⽐如多进程、设置manifest中的largeHeap=true等。
2.减少内存使⽤
①使⽤优化后的集合对象,分场景使⽤SpaseArray和HashMap;
②使⽤的mmkv替代sharedpreference;
③使⽤StringBuilder替代String拼接
④统⼀带有缓存的基础库,特别是图⽚库,如果⽤了两套不⼀样的图⽚加载库就会出现2个图⽚各⾃维护⼀套图⽚缓存
⑤给ImageView设置合适尺⼨的图⽚,列表页显⽰缩略图,查看⼤图显⽰原图
⑥优化业务架构设计,⽐如省市区数据分批加载,需要加载省就加载省,需要加载市就加载失去,避免⼀下⼦加载所有数据
3.避免内存泄漏
(2)ANR和卡顿
(3)过渡绘制
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论