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相關(guān)總結(jié)
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個(gè)問題
view的繪制流程
http://www.reibang.com/p/705a6cb6bfee
每一個(gè)Activity包含一個(gè)PhoneWindow,DecorView是PhoneWindow類的內(nèi)部類,是所有View的根View
measure() MeasureSpec?
EXACTLY 精準(zhǔn)模式颗胡,match_parent或固定值
AT_MOST ?最大模式,wrap_content
UNSPECIFIED 無限制模式舒憾,系統(tǒng)內(nèi)部使用
layout() setFrame() 上下左右4個(gè)位置的相對位置
draw() 視圖的繪制工作 繪制背景巷蚪、自身view以及子view
touch事件分發(fā)
5.handler事件分發(fā)過程
handler message looper messageQueue
nativePollOnce()阻塞looper,但不會占用cpu
每個(gè)線程只能有一個(gè)Looper對象,多個(gè)線程可以公用looper
所謂主線程啦扬,只不過比子線程中多了一個(gè)looper中狂,我們的UI線程在只能在主線中刷新,就是應(yīng)為線程的loop方法不斷輪詢繪制的原因扑毡,子線程之所有不能刷新UI胃榕,是因?yàn)樽泳€程沒有l(wèi)oop方法,如果我們把子線程中設(shè)置一個(gè)looper瞄摊,那么子線程也是可以刷新繪制UI的
6.設(shè)計(jì)模式總結(jié)
https://www.runoob.com/design-pattern/proxy-pattern.html
1.適配器模式:接口轉(zhuǎn)換勋又,解決接口兼容問題
例如:FileInputStream ->InputStreamReader ,字節(jié)流轉(zhuǎn)換成Reader子類换帜,從而有了讀取的能力
2.裝飾者模式:動態(tài)的給對象增加新的功能
InputStreamReader -> BufferedReader楔壤,從讀取一個(gè)字符增加了讀取一行字符的能力
3.代理模式:增加中間層,方便分配和控制
JDK 自帶的動態(tài)代理:一定要實(shí)現(xiàn)接口惯驼,通過InvocationHandler 處理器接口蹲嚣,通過invoke對應(yīng)方法實(shí)現(xiàn)代理訪問
Cglib動態(tài)代理:不要求類實(shí)現(xiàn)接口
7.okhttp
描述:輕量級處理網(wǎng)絡(luò)請求的開源框架,自動處理Gzip壓縮祟牲,減少數(shù)據(jù)流量的消耗隙畜,連接池,共享Socket说贝,還能自定義攔截器
自定義攔截器分為兩種:
1)ApplicationInterceptor(應(yīng)用攔截器)
2)NetworkInterceptor(網(wǎng)絡(luò)攔截器)
1.都能對Response進(jìn)行攔截,但是執(zhí)行順序不同议惰,前者最先執(zhí)行,多個(gè)攔截器會按照list中的順序依次執(zhí)行
2.網(wǎng)絡(luò)攔截器可能執(zhí)行多次
所有攔截器:
Application攔截器
retryAndFollowUpInterceptor?重定向和失敗后重新請求攔截器
BridgeInterceptor?網(wǎng)橋攔截器
CacheInterceptor?緩存處理攔截器
ConnectInterceptor?Socket層的握手鏈接攔截器
networkInterceptors 網(wǎng)絡(luò)攔截器
CallServerInterceptor?client和Server之前的讀寫操作
自定義攔截器可以:
1.URL重定向
2.請求體數(shù)據(jù)加密
http://www.reibang.com/p/da4a806e599b
http://www.reibang.com/p/eaee7cd227cd
8.Retrofit
優(yōu)點(diǎn):超級解耦乡恕,包含動態(tài)代理言询、適配器模式俯萎、策略模式、裝飾者模式等大量的解耦思路
https://blog.csdn.net/stven_king/article/details/51839537
9.Rxjava
描述:一個(gè)鏈?zhǔn)秸{(diào)用的實(shí)現(xiàn)異步操作的開源框架
1.擴(kuò)展的觀察者模式倍试,
Observable被觀察者 ??subscribe訂閱 ??Observer觀察者
通過lift()實(shí)現(xiàn)Observable的調(diào)用及進(jìn)行變換/鋪平讯屈,實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用的過程
2.Scheduler——調(diào)度器,指定代碼的運(yùn)行線程,包含4種:
Schedulers.immediate县习,當(dāng)前線程
Schedulers.newThread涮母,新線程
Schedulers.io,IO
Schedulers.computation,密集型(圖像)
10.eventBus
簡化了應(yīng)用程序內(nèi)各個(gè)組件之間進(jìn)行通信的復(fù)雜度
1.三個(gè)角色:
Event:事件?
?Subscriber:事件訂閱者?
?Publisher:事件的發(fā)布者
2.四種線程模型躁愿,指定線程:POSTING MAIN BACKGROUND ASYNC
http://www.reibang.com/p/e7d5c7bda783
http://www.reibang.com/p/d9516884dbd4
11.RecyclerView四級緩存
https://blog.csdn.net/HJsir/article/details/81485653
public final class Recycler {
//一級緩存中用來存儲屏幕中顯示的ViewHolder
final ArrayList<ViewHolder> mAttachedScrap = new ArrayList<ViewHolder>();
private ArrayList<ViewHolder> mChangedScrap = null;
//二級緩存中用來存儲屏幕外的緩存
final ArrayList<ViewHolder> mCachedViews = new ArrayList<ViewHolder>();
private int mViewCacheMax = DEFAULT_CACHE_SIZE;
//四級緩存當(dāng)屏幕外緩存的大小大于2叛本,便放入mRecyclerPool中緩存。
private RecycledViewPool mRecyclerPool;
//三級緩存自定義緩存彤钟,根據(jù)coder自己定義的緩存規(guī)則来候。
private ViewCacheExtension mViewCacheExtension;
SparseArray<ScrapData> mScrap = new SparseArray<>();
SparseArray與和HasmMap做對比
ArrayList和LinkedList做對比
12.listview復(fù)用機(jī)制
RecycleBin 中存放了需要復(fù)用的view,一開始里面是空的逸雹,當(dāng)繪制完畢之后营搅,會被添加到RecycleBin,此時(shí)convertView不為空
12.注解
本質(zhì)就是一個(gè)繼承了 Annotation 接口的接口
類似xml的標(biāo)簽語句梆砸,可以給方法加標(biāo)簽转质,通過方法名返回注解屬性值
實(shí)現(xiàn)原理是:虛擬機(jī)在編譯的時(shí)候就會將注解寫入元素屬性表,在運(yùn)行的時(shí)候帖世,采用 JDK 動態(tài)代理機(jī)制生成一個(gè)目標(biāo)注解的代理類
將元素取出來休蟹,交給AnnotationInvocationHandler處理執(zhí)行
13.fragment生命周期
onAttach()
onCreate()
onCreateView()
---------------------------------------------->Activity.onCreate()
onActivityCreated()
onstart()
onresume()
...
onpause()
onStop()
onDestroyView()
onDestroy()
onDetach()
--------------------------------->Activity.onDestroy()
14.View事件分發(fā)流程
https://www.cnblogs.com/smyhvae/p/4802274.html
ViewGroup分為:
onDispatchEvent()
onInterceptTouchEvent()
onTouchEvent()
內(nèi)部分為:
DOWN-MOVE-UP-LongClick-Click
15.圖片請求框架
Glide with(context).load(url).into()
優(yōu)點(diǎn):多種圖片格式的緩存,適用于更多的內(nèi)容表現(xiàn)形式(如Gif日矫、WebP赂弓、縮略圖、Video) * 生命周期集成(根據(jù)Activity或者Fragment的生命周期管理圖片加載請求) * 高效處理Bitmap(bitmap的復(fù)用和主動回收哪轿,減少系統(tǒng)回收壓力) * 高效的緩存策略盈魁,靈活(Picasso只會緩存原始尺寸的圖片,Glide緩存的是多種規(guī)格)窃诉,加載速度快且內(nèi)存開銷斜赴!(默認(rèn)Bitmap格式的不同,使得內(nèi)存開銷是Picasso的一半)
16.synchronized與lock區(qū)別
17褐奴,http相關(guān)
18. 匿名內(nèi)部類
1.內(nèi)部類對象的創(chuàng)建依賴于外部類對象;
2 內(nèi)部類對象持有指向外部類對象的引用于毙。
https://blog.csdn.net/qq_27888773/article/details/78333841
19.三次握手和四次揮手
https://blog.csdn.net/qq_38950316/article/details/81087809
19.三次握手和四次揮手
RecyclerView緩存:
Recyclerview有四級緩存敦冬,分別是mAttachedScrap(屏幕內(nèi)),mCacheViews(屏幕外)唯沮,mViewCacheExtension(自定義緩存)脖旱,mRecyclerPool(緩存池)
鏈接:http://www.reibang.com/p/443d741c7e3e
20.類加載
加載-鏈接-初始化-使用-卸載
加鏈初始卸
http://www.reibang.com/p/dd39654231e0