1.Activity A -> Activity B
A:onCreate() onStart() onResume()
A:onPause()
B:onCreate() onStart() onResume()
A:onStop()
返回后:
B:onPause()
A:onRestart() onStart() onResume()
B:onStop() onDestroy()
2.String相关总结
1,Stringbuilder()>Stringbuffer()>String
2,线程不安全 线程安全
3.单例饱汉式(懒汉式)和饿汉式
饱汉式:
public class Singleton{
private volatile static Singleton instance = null;
private Single(){}
public static Singleton getInstance (){
if(instance == null) {
synchronized(Singleton.class){
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
饿汉式:
public class Singleton{
private final static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
4.需要搞清楚的3个问题
view的绘制流程
https://www.jianshu.com/p/705a6cb6bfee
每一个Activity包含一个PhoneWindow,DecorView是PhoneWindow类的内部类,是所有View的根View
measure() MeasureSpec
EXACTLY 精准模式,match_parent或固定值
AT_MOST 最大模式,wrap_content
UNSPECIFIED 无限制模式,系统内部使用
layout() setFrame() 上下左右4个位置的相对位置
draw() 视图的绘制工作 绘制背景、自身view以及子view
touch事件分发
5.handler事件分发过程
handler message looper messageQueue
nativePollOnce()阻塞looper,但不会占用cpu
每个线程只能有一个Looper对象,多个线程可以公用looper
所谓主线程,只不过比子线程中多了一个looper,我们的UI线程在只能在主线中刷新,就是应为线程的loop方法不断轮询绘制的原因,子线程之所有不能刷新UI,是因为子线程没有loop方法,如果我们把子线程中设置一个looper,那么子线程也是可以刷新绘制UI的
6.设计模式总结
https://www.runoob.com/design-pattern/proxy-pattern.html
1.适配器模式:接口转换,解决接口兼容问题
例如:FileInputStream ->InputStreamReader ,字节流转换成Reader子类,从而有了读取的能力
2.装饰者模式:动态的给对象增加新的功能
InputStreamReader -> BufferedReader,从读取一个字符增加了读取一行字符的能力
3.代理模式:增加中间层,方便分配和控制
JDK 自带的动态代理:一定要实现接口,通过InvocationHandler 处理器接口,通过invoke对应方法实现代理访问
Cglib动态代理:不要求类实现接口
7.okhttp
描述:轻量级处理网络请求的开源框架,自动处理Gzip压缩,减少数据流量的消耗,连接池,共享Socket,还能自定义拦截器
自定义拦截器分为两种:
1)ApplicationInterceptor(应用拦截器)
2)NetworkInterceptor(网络拦截器)
1.都能对Response进行拦截,但是执行顺序不同,前者最先执行,多个拦截器会按照list中的顺序依次执行
2.网络拦截器可能执行多次
所有拦截器:
Application拦截器
retryAndFollowUpInterceptor 重定向和失败后重新请求拦截器
BridgeInterceptor 网桥拦截器
CacheInterceptor 缓存处理拦截器
ConnectInterceptor Socket层的握手链接拦截器
networkInterceptors 网络拦截器
CallServerInterceptor client和Server之前的读写操作
自定义拦截器可以:
1.URL重定向
2.请求体数据加密
https://www.jianshu.com/p/da4a806e599b
https://www.jianshu.com/p/eaee7cd227cd
8.Retrofit
优点:超级解耦,包含动态代理、适配器模式、策略模式、装饰者模式等大量的解耦思路
https://blog.csdn.net/stven_king/article/details/51839537
9.Rxjava
描述:一个链式调用的实现异步操作的开源框架
1.扩展的观察者模式,
Observable被观察者 subscribe订阅 Observer观察者
通过lift()实现Observable的调用及进行变换/铺平,实现链式调用的过程
2.Scheduler——调度器,指定代码的运行线程,包含4种:
Schedulers.immediate,当前线程
Schedulers.newThread,新线程
Schedulers.io,IO
Schedulers.computation,密集型(图像)
10.eventBus
简化了应用程序内各个组件之间进行通信的复杂度
1.三个角色:
Event:事件
Subscriber:事件订阅者
Publisher:事件的发布者
2.四种线程模型,指定线程:POSTING MAIN BACKGROUND ASYNC
https://www.jianshu.com/p/e7d5c7bda783
https://www.jianshu.com/p/d9516884dbd4
11.RecyclerView四级缓存
https://blog.csdn.net/HJsir/article/details/81485653
public final class Recycler {
//一级缓存中用来存储屏幕中显示的ViewHolder
final ArrayList
private ArrayList
//二级缓存中用来存储屏幕外的缓存
final ArrayList
private int mViewCacheMax = DEFAULT_CACHE_SIZE;
//四级缓存当屏幕外缓存的大小大于2,便放入mRecyclerPool中缓存。
private RecycledViewPool mRecyclerPool;
//三级缓存自定义缓存,根据coder自己定义的缓存规则。
private ViewCacheExtension mViewCacheExtension;
SparseArray
SparseArray与和HasmMap做对比
ArrayList和LinkedList做对比
12.listview复用机制
RecycleBin 中存放了需要复用的view,一开始里面是空的,当绘制完毕之后,会被添加到RecycleBin,此时convertView不为空
12.注解
本质就是一个继承了 Annotation 接口的接口
类似xml的标签语句,可以给方法加标签,通过方法名返回注解属性值
实现原理是:虚拟机在编译的时候就会将注解写入元素属性表,在运行的时候,采用 JDK 动态代理机制生成一个目标注解的代理类
将元素取出来,交给AnnotationInvocationHandler处理执行
13.fragment生命周期
onAttach()
onCreate()
onCreateView()
---------------------------------------------->Activity.onCreate()
onActivityCreated()
onstart()
onresume()
...
onpause()
onStop()
onDestroyView()
onDestroy()
onDetach()
--------------------------------->Activity.onDestroy()
14.View事件分发流程
https://www.cnblogs.com/smyhvae/p/4802274.html
ViewGroup分为:
onDispatchEvent()
onInterceptTouchEvent()
onTouchEvent()
内部分为:
DOWN-MOVE-UP-LongClick-Click
15.图片请求框架
Glide with(context).load(url).into()
优点:多种图片格式的缓存,适用于更多的内容表现形式(如Gif、WebP、缩略图、Video) * 生命周期集成(根据Activity或者Fragment的生命周期管理图片加载请求) * 高效处理Bitmap(bitmap的复用和主动回收,减少系统回收压力) * 高效的缓存策略,灵活(Picasso只会缓存原始尺寸的图片,Glide缓存的是多种规格),加载速度快且内存开销小(默认Bitmap格式的不同,使得内存开销是Picasso的一半)
16.synchronized与lock区别
17,http相关
18. 匿名内部类
1.内部类对象的创建依赖于外部类对象;
2 内部类对象持有指向外部类对象的引用。
https://blog.csdn.net/qq_27888773/article/details/78333841
19.三次握手和四次挥手
https://blog.csdn.net/qq_38950316/article/details/81087809
19.三次握手和四次挥手
RecyclerView缓存:
Recyclerview有四级缓存,分别是mAttachedScrap(屏幕内),mCacheViews(屏幕外),mViewCacheExtension(自定义缓存),mRecyclerPool(缓存池)
链接:https://www.jianshu.com/p/443d741c7e3e
20.类加载
加载-链接-初始化-使用-卸载
加链初始卸
https://www.jianshu.com/p/dd39654231e0