前言
- 最近要把一直用的Picasso替換成glide,因此筆者網上搜索了一下相關資源,順帶連源碼也一塊兒下下來看看。
- 先記錄一些我瀏覽過覺得還挺不錯的關於glide使用介紹和技巧的帖子吧。
- Glide的with(context)的選擇
http://stackoverflow.com/questions/31964737/glide-image-loading-with-application-context/32887693#32887693 - UIL,Picasso,Glide,Fresco,Volley-ImageLoader對比:
http://stackoverflow.com/questions/29363321/picasso-v-s-imageloader-v-s-fresco-vs-glide - Glide使用技巧,如列表加載,列表滾動複用
http://www.jianshu.com/p/4a3177b57949 - Glide對下載下來的圖片二次裁剪\渲染\着色處理-開源庫:
https://github.com/cxMax/GlidePalette
https://github.com/cxMax/glide-transformations - glide的使用介紹
https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en - Glide源碼分析:
http://www.lightskystreet.com/2015/10/12/glide_source_analysis/
http://frodoking.github.io/2015/10/10/android-glide/
正文
- 設計圖:
- 流程圖:
- 類關係圖:
源碼分析
注:這裏寫得會比較亂
筆者看源碼,有個習慣,喜歡按照他鏈式調用去一步一步向下看。
Glide類 : Glide.with(context).load(url).into(imageView);
1.ArrayPool,BitmapPool,BitmapPool 會在trimMemory的時候,釋放資源,由此可見,可是哪個類肯定肯存儲的圖片相關,先放在這裏,後面再細看。
2.Glide的初始化,跟Picasso類似,Glide的初始化也很有意思。Gilde內部是持有的context.getApplicationContext(),其參數是通過外部類GlideBuilder的createGlide()方法來初始化內部各個變量。然後在通過Glide()的構造函數,把初始化的變量傳遞回來。Glide內部是沒有持有Context的,這種寫法也避免了單例模式的常見的內存泄露寫法。
3.同Picasso類似, Glide.with(context)返回的也是RequestManager,那我們將進行下一步看RequestManager這個類
3.Glide在使用介紹的時候,也特別說明了,相對於Picasso,Glide不會持有applicationcontext,會根據fragment,activity的context,進行圖片加載、停止、暫停。因此在內存表現上,更優於Picasso,(使用Picasso會經常出現OOM的異常,不知道大家是否有遇到)。因此,這一點的實現,筆者也是比較好奇的。如何做掉持有context並對lifecycle進行回調的。因此我們也得去RequestManager這個類看一下實現。
RequestManager:
接上面的疑問,如何隨生命週期進行回收\暫停?
1.Lifecycle : listening to Activity/Fragment lifecycle events. 綁定LifecycleListener生命週期回收監聽事件。
2.LifecycleListener: void onStart(); void onStop(); void onDestroy();
3.TargetTracker:內部持有一個weakRefereance,把目標target傳遞進去,然後調用對應LifecycleListener的方法。
4.RequestManager內部通過track和untrack的方法對目標target的生命週期進行綁定。具體執行綁定的代碼在構造Glide的時候,亦就是GlideBuilder裏面就進行了track進行target的綁定
/————————-分割線———————————–/
2017年1月17日
根據glide生命週期,學着擼了一個庫,對於異步持有的context防內存泄漏的代碼,有着很好的監聽和做對應的釋放操作,類似於RxLifecycle。
https://github.com/cxMax/LifeCycler