快餐式讀完一些Android第三方庫

目錄

  • OkHttp
  • Retrofit
  • RxJava2
  • Glide
  • LeakCanary
  • LeakCanary2
  • BlockCanary
  • Legend
  • RetrofitUrlManager
  • Lieric
  • EventBus(在寫)
  • 插件化
  • Proguard (在寫)
  • Gson
  • 再看還有哪些

OkHttp

1.初始化喊儡,用的是Builder建造者模式,把什么SocketFactory啊巍佑,HostVerifier啊配置設(shè)置好,了解什么是Build模式,挑幾個組件看一下

延展閱讀
如何做證書固定防止抓包
http://www.reibang.com/p/f2bdcb96c210
如何做加密
http://www.520monkey.com/archives/1234

2.發(fā)送請求琅攘,這里不講同步,只講異步
異步就是看equeue的內(nèi)部實現(xiàn),比如線程池

延展閱讀
必須理清的線程池
https://mp.weixin.qq.com/s/eyFVplFcZoN6-4WTMojtMw

3.如何對請求還有響應(yīng)的處理估灿,這里就是講Interceptor攔截器扫沼,也就是責(zé)任鏈模式出爹,了解責(zé)任鏈模式的好處庄吼,及OkHttp用到的幾個責(zé)任鏈內(nèi)部實現(xiàn)。
比如ConnectInterceptor严就,CacheInterceptor

延展閱讀
緩存機(jī)制
http://www.reibang.com/p/fb81207af121
攔截器的區(qū)別
http://www.reibang.com/p/d04b463806c8

4.鏈接機(jī)制比較復(fù)雜总寻,涉及了連接池等一系列概念,這個就不能是只看部分了梢为,要看就得全套
延展閱讀
連接機(jī)制
http://www.reibang.com/p/4801587c8a1b
連接的三個核心
http://www.reibang.com/p/6166d28983a2

5.最后是讀寫機(jī)制OkIO
http://www.reibang.com/p/f5941bcf3a2d

6.一些應(yīng)用擴(kuò)展方面的渐行,比如HttpDns啊,域名容災(zāi)啊
延展閱讀
Android HttpDns OkHttp踩坑記錄
http://www.reibang.com/p/a0967bed8756
動態(tài)切換域名的庫RetrofitUrlManager(這個其實是攔截器的應(yīng)用)
http://www.reibang.com/p/222b62c06497

完整解析OkHttp的參考鏈接
拆輪子系列
https://blog.piasy.com/2016/07/11/Understand-OkHttp/index.html
隔壁李老頭系列
http://www.reibang.com/p/82f74db14a18
野生的安卓獸系列
http://www.reibang.com/u/6e5ebce41b4f


Retrofit2.0

1.初始化铸董,也就是實例創(chuàng)建祟印,用的是Builder建造者模式
Retrofit的構(gòu)造方法是default的,通過靜態(tài)內(nèi)部類

 Retrofit retrofit = new Retrofit.Builder()
                  .baseUrl("http://fanyi.youdao.com/")
                  .addConverterFactory(GsonConverterFactory.create())
                  .build();

配置好
serviceMethod:包含所有網(wǎng)絡(luò)請求信息的對象
baseUrl:網(wǎng)絡(luò)請求的url地址
callFactory:網(wǎng)絡(luò)請求工廠
adapterFactories:網(wǎng)絡(luò)請求適配器工廠的集合
converterFactories:數(shù)據(jù)轉(zhuǎn)換器工廠的集合

callFactory在Retrofit2.0之后是默認(rèn)OkHttp粟害。

這里是一個外觀模式的創(chuàng)建方式旁理,至于怎么生成一個對象
就是這個create方法內(nèi)部調(diào)用Proxy.newProxyInstance方法。
實現(xiàn)接口InvocationHandler我磁。
這個invoke方法里
主要就是生產(chǎn)serviceMethod
這個ServiceMethod是給后邊OkHttpCall去用的
調(diào)用順序呢
Retrofit.build.create
ServiceMethod.loadServiceMethod
ServiceMethod.build
內(nèi)部parseMethodAnnotation方法孽文,把Api.class內(nèi)的代碼根據(jù)注解全部解析,解析完之后放到一個Map<Method, ServiceMethod<?, ?>> 緩存起來夺艰。
剩下的網(wǎng)絡(luò)請求基本跟okhttp一樣芋哭。

里面
延展閱讀
主要講api的
Android Retrofit 2.0 的詳細(xì) 使用攻略(含實例講解)
http://www.reibang.com/p/a3e162261ab6

完整解析Retrofit2.0的參考鏈接
野生的安卓獸系列
http://www.reibang.com/nb/16181158

Carson_ho系列
http://www.reibang.com/p/0c055ad46b6c


Rxjava2

http://www.reibang.com/c/299d0a51fdd4


Glide

幾個圖片加載庫的對比
http://www.reibang.com/p/97994c9693f9

1.初始化,與Retrofit差不多郁副,外觀模式

Glide.with(this).load(url).into(imageView);

with里面?zhèn)魅胧裁搭愋偷膮?shù)決定了這個圖片的生命周期减牺。
比如傳view,找對應(yīng)的activty或者fragment存谎,傳context去判斷是不是applicationContext拔疚。
當(dāng)然,內(nèi)部還會判斷是不是后臺線程既荚,是的話也返回getApplicationManager稚失。
如果是applicationContext那么返回getApplicationManager來管理圖片生命周,
其余的情況都是attach上一個fragment恰聘,監(jiān)聽這個fragment的生命周期來管理圖片的生命周期句各。

2.三級緩存
讀取過程在Engine類的load方法里
內(nèi)部依次
keyFactory.buildKey生成key---提高圖片命中率可以從這里入手

EngineResource<?> active = loadFromActiveResources(key, isMemoryCacheable);---從activeResource拿,本質(zhì)上是key晴叨,weakReference的map

EngineResource<?> cached = loadFromCache(key, isMemoryCacheable);---從lru拿凿宾,拿到就從lru里刪除,放到activeResouce里

EngineResource用一個acquired來計數(shù)兼蕊,類似方法計數(shù)器初厚。
計數(shù)為0就listener.release

diskLru什么時候讀
EngineRunnable的run方法內(nèi)部調(diào)用decode方法。

3.內(nèi)存回收
Application的triLowMem里面有回收方法孙技,
最終都是解析bitmap产禾,原因也是方便recycle內(nèi)存排作。
以上兩條沒深究了。

4.緩存圖的key生成方法

EngineKey key = keyFactory.buildKey(id, signature, width, height, loadProvider.getCacheDecoder(),
                loadProvider.getSourceDecoder(), transformation, loadProvider.getEncoder(),
                transcoder, loadProvider.getSourceEncoder());

延展閱讀
郭霖老師的glide解析下愈,在第三部分最后段有講如何提高url命中率
https://blog.csdn.net/guolin_blog/article/details/53759439

完整解析Glide參考鏈接
野生的安卓獸系列
http://www.reibang.com/nb/23459686

Carson_ho系列
http://www.reibang.com/p/c3a5518b58b2


LeakCanary

時刻記住纽绍,檢測Android內(nèi)存泄漏永遠(yuǎn)圍繞 “對象被引用蕾久,無法被GC” 的概念
這個庫實際上就是势似,檢查activity的引用,然后導(dǎo)出引用樹僧著。

核心原理在 weakReference和weakReferenceQueue的使用履因,所以一定要充分了解。
何時去注冊盹愚,何時去dump栅迄,在什么線程,這個都是次要的皆怕。

這個庫比較原理比較簡單毅舆,直接貼別人總結(jié)整理好的
https://mp.weixin.qq.com/s/UfxG41HInNfv9nkDvKpcZQ

延展閱讀
順帶可以學(xué)好好學(xué)習(xí)四大引用
http://www.reibang.com/p/50b9db5924b8


LeakCanary 2

http://www.reibang.com/p/80f18e8f330d


Leoric

Leoric骷髏王保活方案閱讀


BlockCanary

說到內(nèi)存泄漏的庫愈腾,就不得不提到這個檢測卡頓的庫憋活。

這是作者寫的原理解析
http://blog.zhaiyifan.cn/2016/01/16/BlockCanaryTransparentPerformanceMonitor/

Android UI卡頓監(jiān)測框架BlockCanary原理分析
http://www.reibang.com/p/e58992439793

這一篇源碼閱讀還有流程分析也寫得很好
http://www.reibang.com/p/55c08d21e63b

本質(zhì)上,就是對Looper.loop方法內(nèi)的dispatchMsg進(jìn)行了監(jiān)聽虱黄,該庫認(rèn)為卡頓都是有誰阻塞了消息的派發(fā)悦即。

這個庫的源碼也比較簡單,一般是會被發(fā)散問到 handler的機(jī)制橱乱。
比如辜梳,為什么handler里的sendMsgDelay不會阻塞,為什么loop死循環(huán)不會卡UI
前者關(guān)健是loop的needAwake字段泳叠,后者關(guān)鍵是是pipe管道機(jī)制

延展閱讀
線程學(xué)習(xí)作瞄,上面兩個阻塞問題看handler部分
http://www.reibang.com/p/fb07e8b77eb1


Legend

免root的hook框架

兩個方式調(diào)用,注解和api危纫。
通過注解的方式粉洼,最終也是調(diào)用api方式。
說白了叶摄,就是一個靈活調(diào)用反射的庫属韧,然后把需要反射的方法放入一個map里緩存。
但是又和普通的反射調(diào)用不一樣蛤吓,它不是直接invoke調(diào)用宵喂,
它是構(gòu)造了一個舊方法的結(jié)構(gòu)體信息,把hook的新數(shù)據(jù)寫進(jìn)去会傲,然后用Native方法锅棕,把這個結(jié)構(gòu)體數(shù)據(jù)寫入內(nèi)存(實際是指針重新指向這個新的結(jié)構(gòu)體)拙泽。

延展閱讀
http://www.reibang.com/p/55ac341ca6cb


RetrofitUrlManager

這是一個用于動態(tài)域名切換的庫
本質(zhì)呢,是利用OkHttp的攔截器完成域名攔截替換的工作裸燎,
內(nèi)部維護(hù)三種不同級別的解析器顾瞻,結(jié)合Retrofit的ServiceMethod解析方法(實際上就是注解的方式)解析url,解析完放入cache里德绿。
還提供里兩個callback荷荤,用來提示替換過程。

延展閱讀
http://www.reibang.com/p/222b62c06497


EvnetBus

在寫這一部分之前移稳,要了解什么是注解蕴纳,如何使用注解

延展閱讀
http://www.reibang.com/p/1544b7f119bf


插件化

這個總結(jié)在另一篇了
http://www.reibang.com/p/9f392c46e670
要重點理解,生命周期如何管理(一般是activity的為主)个粱,資源R文件重名怎么辦古毛,如何調(diào)用插件類。
關(guān)鍵詞都许,hook稻薇,classLoader的雙親委派機(jī)制,反射原理
實際應(yīng)用胶征,換膚
https://github.com/hongyangAndroid/ChangeSkin


Proguard

各種工廠類進(jìn)行參數(shù)/方法名替換的工作
沒啥好重點的

延展閱讀
http://www.reibang.com/p/734424a14eff


Gson

http://www.reibang.com/p/8d8fe91958a0

延展閱讀
http://www.reibang.com/p/aef252db9869

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塞椎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子弧烤,更是在濱河造成了極大的恐慌忱屑,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暇昂,死亡現(xiàn)場離奇詭異莺戒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)急波,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門从铲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人澄暮,你說我怎么就攤上這事名段。” “怎么了泣懊?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵伸辟,是天一觀的道長。 經(jīng)常有香客問我馍刮,道長信夫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮静稻,結(jié)果婚禮上警没,老公的妹妹穿的比我還像新娘。我一直安慰自己振湾,他們只是感情好杀迹,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著押搪,像睡著了一般树酪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嵌言,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天嗅回,我揣著相機(jī)與錄音及穗,去河邊找鬼摧茴。 笑死,一個胖子當(dāng)著我的面吹牛埂陆,可吹牛的內(nèi)容都是我干的苛白。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼焚虱,長吁一口氣:“原來是場噩夢啊……” “哼购裙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鹃栽,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤躏率,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后民鼓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薇芝,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年丰嘉,在試婚紗的時候發(fā)現(xiàn)自己被綠了夯到。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡饮亏,死狀恐怖耍贾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情路幸,我是刑警寧澤荐开,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站简肴,受9級特大地震影響晃听,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一杂伟、第九天 我趴在偏房一處隱蔽的房頂上張望移层。 院中可真熱鬧,春花似錦赫粥、人聲如沸观话。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽频蛔。三九已至,卻和暖如春秦叛,著一層夾襖步出監(jiān)牢的瞬間晦溪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工挣跋, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留三圆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓避咆,卻偏偏與公主長得像舟肉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子查库,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容