Android开发重要知识点
一、网络
1、https原理
2、tcp/ip协议
三次握手:https://www.cnblogs.com/cenglinjinran/p/8482412.html
四次挥手:https://www.zhihu.com/question/63264012
二、多线程
java基础知识相关
Android相关
1、从点击一个图标到这个应用启动的全过程
https://blog.csdn.net/freekiteyu/article/details/79318031
性能优化
https://www.jianshu.com/p/797395731747
三、第三方插件
1、ProtoBuffer
2、EventBus
https://www.jianshu.com/p/e7d5c7bda783
https://www.jianshu.com/p/d9516884dbd4
https://baike.baidu.com/item/EventBus/20461274?fr=aladdin
ThreadLocal、ThreadLocal内存泄漏问题
HashMap,ConcurrentHashMap
反射
注解
3、ButterKnife
和androidx冲突问题,R2代替R
4、Retrofit
官网:https://square.github.io/retrofit/
与OkHttp的区别:定位不一样,OkHttp功能更强更多,而Retrofit是对OkHttp的进一步封装和增减,使其使用更安全,更方便
四、jetpack
1、RecyclerView
缓存问题
多种布局问题:https://www.jianshu.com/p/66702b7a6881
刷新界面问题
空数据界面显示问题:RecyclerView设置空数据视图
2、ConstraintLayout
https://www.jianshu.com/p/17ec9bd6ca8a
五、java基础
1、反射
(1)java反射机制是什么?
java反射机制是一种在程序运行状态下,动态获取或者调用类或对象的方法、字段等所有成员信息的功能。
其本质就是在得到指定类X的Class(Class对象)后,根据该Class对象反向获取类X的各种信息。当X.java被编译后生成X.class文件,当程序运行时,JVM会在磁盘中寻找X.class文件并加载到JVM内存中为其分配内存空间,同时JVM会自动为X.class创建一个Class对象,在ClassLoader中,有且只有一个X类的Class对象。
(2)为什么要使用反射(使用反射有什么好处)?
1)可以动态编译,在运行期才确定类型,体现java的灵活性。比如某个类“A”由同伴开发,但没有开发完,而我需要预先写道代码中,如果直接通过new A()的给方式,编译肯定会报错,但使用Class.forName("A")这样的反射方式就可以通过编译,不影响自己开发和编译。由于Class.forName("...")中的参数是字符串,可以将该字符串写入配置文件,通过I/O的方式读取,这样就可以通过修改配置文件来控制加载哪个类了,java中的Spring就有很多这种操作。
2)可以访问类中用private修饰的字段、方法、构造函数等成员。
3)可以对某些类/方法/字段起到“后门”作用。比如某些类方法/字段比较敏感,为了避免外部人员不小心使用到而导致某些严重后果,就需要“隐藏”起来(比如用private修饰),但是内部开发人员又需要用到,这时候就可以使用反射的方式来实现。因为相比于通过new的方式直接使用,反射方式会复杂一些,且需要对该敏感的类/方法/字段比较了解。(这个说法是在某教学课堂上老师讲到的,听起来挺有道理的,但其它地方好像没听说过这种说法)
4)可以越过泛型。比如ArrayList定义好元素的类型后,就无法添加其它类型了,但是通过反射的方式却可以做到,可以参考后文的链接。
(3)反射有什么弊端?
1)性能差;原因后面有说明。为了避免这一点,有些地方通过使用注解生成器的方式将需要反射的地方提前到编译期完成,比如EventBus就可以通过选择使用注解生成器来实现这一点。有个比较有名的java反射框架jOOR,可以了解一下。
2)会破坏一些类的安全性。上面的第2)和第3)点也说到了,可以使用private修饰的成员等这些不太希望被“外人”使用的功能。
(4)反射为什么性能差?
没找到权威答案,网上零零星星收集了一些(参考https://www.zhihu.com/question/19826278):
1)jvm无法优化反射相关得代码;
2)动态加载,原本在编译期做的事,等到运行期才做;
3)反射的具体逻辑是委托给MethodAccessor实现,而该类需要在第一次调用invoke时才会实例化对象,是一种lazy init;
4)method.invoke方法,每次调用时都需要对参数进行数组包装;
5)method.invoke方法中要对方法的可见性做检查;
6)MethodAccessor对象实现反射有两种方式:开始15次是native方式,以后是java方式。在使用java方式时,其invoke方法中要检查参数的类型匹配。
2、面向对象
(1)面向对象的三大特性:封装、继承、多态;
多态:1)重写,override,子类覆盖父类的方法;重载,overload,同一个类中方法名相同,参数必须不同,返回值、修饰符可以不同。