Java知識分享網 - 輕松學習從此開始!????

Java知識分享網

Java1234官方群25:java1234官方群25
Java1234官方群25:838462530
        

實戰springboot+CAS單點登錄課程(免費領取)

SpringBoot打造全棧在線教育平臺實戰課程

畢設代做論文包查重聯系人QQ:1982956321畢設大神 畢設代做論文包查重

66套java實戰課程無套路領取

Java1234 VIP課程

領取微信掃碼登錄Java實現視頻教程

Java1234至尊VIP(特價活動)

一線互聯網三方源碼高頻面試總結 PDF 下載


分享到:
時間:2020-11-11 15:04來源:http://www.nukdnfhq.buzz 作者:小鋒  侵權舉報
一線互聯網三方源碼高頻面試總結 PDF 下載
失效鏈接處理
一線互聯網三方源碼高頻面試總結 PDF 下載

本站整理下載:
 
相關截圖:


主要內容:

1.Glide :加載、緩存、LRU 算法 (如何自 己設計一個大圖加載框架) (LRUCache 原 理)如何閱讀源碼 在開始解析 Glide 源碼之前,我想先和大家談一下該如何閱讀源碼,這個問題也是我平時被 問得比較多的,因為很多人都覺得閱讀源碼是一件比較困難的事情。 那么閱讀源碼到底困難嗎?這個當然主要還是要視具體的源碼而定。比如同樣是圖片加載框 架,我讀 Volley 的源碼時就感覺酣暢淋漓,并且對 Volley 的架構設計和代碼質量深感佩服。 讀 Glide 的源碼時卻讓我相當痛苦,代碼極其難懂。當然這里我并不是說 Glide 的代碼寫得 不好,只是因為 Glide 和復雜程度和 Volley 完全不是在一個量級上的。 那么,雖然源碼的復雜程度是外在的不可變條件,但我們卻可以通過一些技巧來提升自己閱 讀源碼的能力。這里我和大家分享一下我平時閱讀源碼時所使用的技巧,簡單概括就是八個 字:抽絲剝繭、點到即止。應該認準一個功能點,然后去分析這個功能點是如何實現的。但 只要去追尋主體的實現邏輯即可,千萬不要試圖去搞懂每一行代碼都是什么意思,那樣很容 易會陷入到思維黑洞當中,而且越陷越深。因為這些龐大的系統都不是由一個人寫出來的, 每一行代碼都想搞明白,就會感覺自己是在盲人摸象,永遠也研究不透。如果只是去分析主 體的實現邏輯,那么就有比較明確的目的性,這樣閱讀源碼會更加輕松,也更加有成效。 而今天帶大家閱讀的 Glide 源碼就非常適合使用這個技巧,因為 Glide 的源碼太復雜了,千 萬不要試圖去搞明白它每行代碼的作用,而是應該只分析它的主體實現邏輯。那么我們本篇 文章就先確立好一個目標,就是要通過閱讀源碼搞明白下面這行代碼: Glide.with(this).load(url).into(imageView); 到底是如何實現將一張網絡圖片展示到 ImageView 上面的。先將 Glide 的一整套圖片加載機 制的基本流程梳理清楚,然后我們再通過后面的幾篇文章具體去了解 Glide 源碼方方面面的 細節。 準備好了嗎?那么我們現在開始。 源碼下載 既然是要閱讀 Glide 的源碼,那么我們自然需要先將 Glide 的源碼下載下來。其實如果你是 使用在 build.gradle 中添加依賴的方式將 Glide 引入到項目中的,那么源碼自動就已經下載下 來了,在 Android Studio 中就可以直接進行查看。
不過,使用添加依賴的方式引入的 Glide,我們只能看到它的源碼,但不能做任何的修改, 如果你還需要修改它的源碼的話,可以到 GitHub 上面將它的完整源碼下載下來。 Glide 的 GitHub 主頁的地址是:https://github.com/bumptech/glide 不過在這個地址下載到的永遠都是最新的源碼,有可能還正在處于開發當中。而我們整個系 列都是使用 Glide 3.7.0 這個版本來進行講解的,因此如果你需要專門去下載 3.7.0 版本的源 碼,可以到這個地址進行下載:https://github.com/bumptech/glide/tree/v3.7.0 開始閱讀 我們在上一篇文章中已經學習過了,Glide 最基本的用法就是三步走:先 with(),再 load(), 最后 into()。那么我們開始一步步閱讀這三步走的源碼,先從 with()看起。 1. with() with()方法是 Glide 類中的一組靜態方法,它有好幾個方法重載,我們來看一下 Glide 類中所 有 with()方法的方法重載: public class Glide { ... public static RequestManager with(Context context) { RequestManagerRetriever retriever = RequestManagerRetriever.get(); return retriever.get(context); }public static RequestManager with(Activity activity) { RequestManagerRetriever retriever = RequestManagerRetriever.get(); return retriever.get(activity); }public static RequestManager with(FragmentActivity activity) { RequestManagerRetriever retriever = RequestManagerRetriever.get(); return retriever.get(activity); }@TargetApi(Build.VERSION_CODES.HONEYCOMB) public static RequestManager with(android.app.Fragment fragment) { RequestManagerRetriever retriever = RequestManagerRetriever.get(); return retriever.get(fragment); }public static RequestManager with(Fragment fragment) {
RequestManagerRetriever retriever = RequestManagerRetriever.get(); return retriever.get(fragment); } }可以看到,with()方法的重載種類非常多,既可以傳入 Activity,也可以傳入 Fragment 或者 是 Context。每一個 with()方法重載的代碼都非常簡單,都是先調用 RequestManagerRetriever 的靜態 get()方法得到一個 RequestManagerRetriever 對象,這個靜態 get()方法就是一個單例 實現,沒什么需要解釋的。然后再調用 RequestManagerRetriever 的實例 get()方法,去獲取 RequestManager 對象。 而 RequestManagerRetriever 的實例 get()方法中的邏輯是什么樣的呢?我們一起來看一看: public class RequestManagerRetriever implements Handler.Callback { private static final RequestManagerRetriever INSTANCE = new RequestManagerRetriever(); private volatile RequestManager applicationManager; ... /*** Retrieves and returns the RequestManagerRetriever singleton. */ public static RequestManagerRetriever get() { return INSTANCE; }private RequestManager getApplicationManager(Context context) { // Either an application context or we're on a background thread. if (applicationManager == null) { synchronized (this) { if (applicationManager == null) { // Normally pause/resume is taken care of by the fragment we add to the fragment or activity. // However, in this case since the manager attached to the application will not receive lifecycle // events, we must force the manager to start resumed using ApplicationLifecycle. applicationManager = new RequestManager(context.getApplicationContext(), new ApplicationLifecycle(), new EmptyRequestManagerTreeNode()); } }
}return applicationManager; }public RequestManager get(Context context) { if (context == null) { throw new IllegalArgumentException("You cannot start a load on a null Context"); } else if (Util.isOnMainThread() && !(context instanceof Application)) { if (context instanceof FragmentActivity) { return get((FragmentActivity) context); } else if (context instanceof Activity) { return get((Activity) context); } else if (context instanceof ContextWrapper) { return get(((ContextWrapper) context).getBaseContext()); } }return getApplicationManager(context); }public RequestManager get(FragmentActivity activity) { if (Util.isOnBackgroundThread()) { return get(activity.getApplicationContext()); } else {assertNotDestroyed(activity); FragmentManager fm = activity.getSupportFragmentManager(); return supportFragmentGet(activity, fm); } }public RequestManager get(Fragment fragment) { if (fragment.getActivity() == null) { throw new IllegalArgumentException("You cannot start a load on a fragment before it is attached"); }if (Util.isOnBackgroundThread()) { return get(fragment.getActivity().getApplicationContext()); } else {FragmentManager fm = fragment.getChildFragmentManager(); return supportFragmentGet(fragment.getActivity(), fm); } }@TargetApi(Build.VERSION_CODES.HONEYCOMB) public RequestManager get(Activity activity) {
 

------分隔線----------------------------
鋒哥公眾號


鋒哥微信


關注公眾號
【Java資料站】
回復 666
獲取 
66套java
從菜雞到大神
項目實戰課程
山东麻将怎么开牌 5956203774246729513269225395130230798959052619686525945531922677871998126838893146191297389772052 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();