android面試題- Volley源碼剖析

2022-01-01 馬偉奇投資

今天就帶大家一層層剝光Volley這位懵懂無知少女(14年出生,應該算無知少女)的外衣,帶大家輕輕撫摸Volley每一寸肌膚,進入Volley的身體,為達到完美效果,開頭錄有激情小視頻,觀看時請自備紙巾,各位現在需要做的就是搬一把椅子,打開電腦,雙擊Android studio導入Volley源碼,隨我一起觀看錄製的激情小視頻帶著大家一起飛,觀看激情小視頻過程中,如能讓你內心微微一顫有所收穫,感受到滿滿的愛意,點讚或打賞都是最美的祝福,橫屏觀看效果更佳。

android面試題-okhttp內核剖析

與源碼相關面試題一

通過一個小慄子慢慢剝開神秘的面紗。

RequestQueue queue = Volley.newRequestQueue(this);  
String url ="http://www.baidu.com";StringRequest stringRequest =
    new StringRequest(Request.Method.GET,     url,                
    new Response.Listener<String>() {     @Override              
    public void onResponse(String response) {     }     }, new Response.ErrorListener() {     @Override                
    public void onErrorResponse(VolleyError error) {     }    }); queue.add(stringRequest);

第一部分:一行行分析

RequestQueue queue = Volley.newRequestQueue(this);

進入源碼分析:

public static RequestQueue newRequestQueue(Context context) {
  return newRequestQueue(context, (HttpStack)null);}

由以上源碼分析可知:

1)該方法有兩個參數,第一個Context是上下文,第二個參數為null

public static RequestQueue newRequestQueue(Context context,
HttpStack stack) {   File cacheDir = new File(context.getCacheDir(), "volley");
  String userAgent = "volley/0";  
   try {  
    String network = context.getPackageName();     PackageInfo queue = context.getPackageManager().getPackageInfo(network, 0);     userAgent = network + "/" + queue.versionCode;   } catch (NameNotFoundException var6) {   } if(stack == null) {  
    if(VERSION.SDK_INT >= 9) {     stack = new HurlStack();   } else {    stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));   } } BasicNetwork network1 = new BasicNetwork((HttpStack)stack); RequestQueue queue1 = new RequestQueue(new  DiskBasedCache(cacheDir),
    network1);  queue1.start();
 return queue1; }

由以上源碼分析可知:

1)初始化緩存文件,名字叫volley。

2)獲取到當前應用包名和包的基本信息,並且給userAgent 重新賦值。

3)stack 傳遞過來為null,所以直接走if判斷裡面。

4)在這個if中對版本號進行了判斷,如果版本號大於等於9就使得HttpStack對象的實例為HurlStack,如果小於9則實例為HttpClientStack。至於這裡為何進行版本號判斷,實際代碼中已經說明了,請看下文。

5)BasicNetwork是Network接口的實現,BasicNetwork實現了performRequest方法,其作用是根據傳入的HttpStack對象來處理網絡請求。緊接著new出一個RequestQueue對象,並調用它的start()方法進行啟動,然後將RequestQueue返回。RequestQueue是根目錄下的一個類,其作用是一個請求調度隊列調度程序的線程池。這樣newRequestQueue()的方法就執行結束了。

第四條如何分析出來請看如下代碼:

public class HurlStack implements HttpStack public class HttpClientStack
implements HttpStack

繼承httpStack接口

public interface HttpStack {    HttpResponse performRequest(Request<?> var1, Map<String, String> var2) throws IOException, AuthFailureError;}

接口當中有如下方法,performRequest,大家有沒有覺得奇怪都繼承同一個方法,並且都實現一樣的接口同樣的方法,實際上子類實現方法不一樣,代碼如下:

HttpClientStack代碼如下:

public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders) throws IOException, AuthFailureError {HttpUriRequest httpRequest = createHttpRequest(request, additionalHeaders);      
addHeaders(httpRequest, additionalHeaders);    
addHeaders(httpRequest, request.getHeaders())this.onPrepareRequest(httpRequest)HttpParams httpParams = httpRequest.getParams()int timeoutMs = request.getTimeoutMs()HttpConnectionParams.setConnectionTimeout(httpParams, 5000)HttpConnectionParams.setSoTimeout(httpParams, timeoutMs)return this.mClient.execute(httpRequest)}

HurlStack代碼如下:

public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders) throws IOException, AuthFailureError {     . URL parsedUrl1 = new URL(url); HttpURLConnection connection = this.openConnection(parsedUrl1, request);     .. return response;}}

由以上得知HttpClientStack走的是httpClient,HurlStack走的是HttpURLConnection ,谷歌在高版本當中已經去掉了httpClient,所以這裡必須做版本號的判斷。

繼續源碼分析,現在再來看下RequestQueue隊列的start方法,如下所示:

public void start() {    
   this.stop();      
   this.mCacheDispatcher = new CacheDispatcher(this.mCacheQueue, this.mNetworkQueue, this.mCache, this.mDelivery);    
   this.mCacheDispatcher.start();
   for(int i = 0; i < this.mDispatchers.length; ++i) {   NetworkDispatcher networkDispatcher =
   new  NetworkDispatcher(this.mNetworkQueue, this.mNetwork, this.mCache, this.mDelivery);  
   this.mDispatchers[i] = networkDispatcher;   networkDispatcher.start(); }}

以上源碼可知:

1)創建了一個CacheDispatcher的實例,然後調用了它的start()方法

2)for循環裡去創建NetworkDispatcher的實例,並分別調用它們的start()方法

3)這裡的CacheDispatcher和NetworkDispatcher都是繼承自Thread的,而默認情況下for循環會執行四次,也就是說當調用了Volley.newRequestQueue(context)之後,就會有五個線程一直在後臺運行,不斷等待網絡請求的到來,其中一個CacheDispatcher是緩存線程,四個NetworkDispatcher是網絡請求線程。

第三條如何分析出來for循環會執行四次 , 請看如下代碼分析:

public RequestQueue(Cache cache, Network network, int threadPoolSize, ResponseDelivery delivery) {        .        this.mDispatchers = new NetworkDispatcher[threadPoolSize];        .    }

threadPoolSize大小是4,如何看出來請看如下代碼:

public RequestQueue(Cache cache, Network network, int threadPoolSize) {   this(cache, network, threadPoolSize, new ExecutorDelivery(new Handler(Looper.getMainLooper()))); }    
public RequestQueue(Cache cache, Network network) {   this(cache, network, 4); }

通過構造方法傳遞,默認是4,如上已經把第一行代碼分析完畢,進入第二部分。

RequestQueue queue = Volley.newRequestQueue(this);

相關焦點

  • Vue 3源碼剖析+面試指南,看這篇就夠了
    就拿Vue3來講,很多大公司比如騰訊都已經在新項目中用上了,尤雨溪的Vue3.2都出來了,很多人還沒有用Vue3做過哪怕一個小項目,更別提學習源碼了。這是技術層面的問題。給大家推薦一個《Vue3設計理念及源碼剖析》訓練營。這個訓練營由兩位前端大佬主講(16年全棧大佬+14年經驗的前阿里P7),通過手寫Vue3源碼,簡歷現場剖析和面試輔導三方面,幫大家梳理前端進階的必備核心能力。
  • Android工程師面試題大全
    下面對這段時間面試遇到的問題並結合網上各位的大神秒下的面試題做個總結,本文會持續更新,希望能在面試中助各位一臂之力!Java基礎:1、內存洩露的原因:資源對象沒關閉。如Cursor、File等資源。他們會在finalize中關閉,但這樣效率太低。容易造成內存洩露。
  • Android面試題-終極解決ViewPager.setCurrentItem切換頁面閃瞎我的雙眼
    android面試題-okhttp內核剖析android面試題- Volley源碼剖析
  • Android Studio 查看Android內部隱藏源碼
    問題的發現 今天查看 AlertDialog 源碼的時候,看到 AlertController,發現關於這部分的代碼全都報紅,原來 AlertController類在com.android.internal.app 這個包下,看這個包名 internal(內部的),也就是說這部分代碼是 Google 公司由於安全和穩定等因素考慮,是不對外開放的。
  • Volley 實現細節討論及 Android 職位分享
  • 熬夜整理了一份Android高頻面試題集錦+開源框架實戰PDF
    Android源碼(★★★★)1、事件分發機制是怎樣的?設計者為什麼要設置攔截?2、Android是如何通過View進行渲染的?3、Android App 安裝的流程是怎樣的?…… 開源框架實戰1.項目中常見面試題9. 即時通訊是怎麼做的?(★★★★★)10. 設計模式六大原則(★★★)11. 第三方登陸(★★★★)12. 第三方支付(★★★★★)13.
  • 一次Android面試心得及面試題總結
    作者:huison_ma來源:blog.csdn.net/qq_27053103/article/details/79564062從16年畢業至今,就職過兩家公司,大大小小項目做了幾個,非常感謝我的兩位老大,在我的android成長路上給予我很多指導,亦師亦友的關係。
  • 不會查看系統源碼,還搞什麼Android?
    上圖箭頭指向的Browse按鈕來選擇本地系統源碼所在的路徑,比如我的系統源碼路徑為:D:/Android/android-8.0.0_r1 。idegen模塊編譯成功後,會在 out/host/linux-x86/framework目錄下生成idegen.jar,執行如下命令:sudo development/tools/idegen/idegen.sh這時會在源碼根目錄生成android.iml 和 android.ipr 兩個文件,這兩個文件一般是只讀模式,這裡建議改成可讀可寫
  • Android Handler 由淺入深源碼全解析
    前言    Handler在android開發中可謂隨處可見,不論你是一個剛開始學習android
  • 2017 年 Android 曲折的求職之路
    然後前臺妹子給我的筆試題居然是 Java 的(貌似給錯了)面試的深度基本跟 1905 那哥們差不多,也是 activity 啟動模式跟手勢傳遞還有 Looper 的源碼那塊問的比較多只是這個人最後問了一個尺子的效果:附上項目地址哈https://github.com/kailaisi/WheelSelect類似這個地址 demo 的實現效果只是年齡換成了金額(畢竟是做金融的公司
  • Framework學習Android系統源碼下載與編譯
    推薦方法是以根用戶身份在 /etc/udev/rules.d/51-android.rules 路徑創建文件。我們可以通過如下指令來實現(注意用你的系統username替換指令中的):wget -S -O - http://source.android.com/source/51-android.rules | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev
  • Github一夜爆火的SSM源碼剖析手冊也太香了吧
    前言SSM作為目前主流的JavaEE企業級框架,可以說現在面試必被問到SSM的實現原理、架構設計,似乎不啃上幾遍源碼,都不好意思跟面試官交流。何況在面試「造火箭」、工作「螺絲釘」的大環境下,很多程式設計師雖然對框架使用得非常嫻熟,但對底層原理及架構設計缺少足夠的積累與認知,知其然卻不知其所以然。我們學習的各種設計模式,最終都需要在源碼中進行落地。當然,我們也需要從優秀的源碼中挖掘設計模式及設計模式的應用場景,學習其中的設計藝術。所以,學習源碼已經是大勢所趨!如何高效閱讀源碼?
  • 一些優秀的 Android 開發專欄推薦
    《Android 開發面試 「108」 問》《應屆生應該如何準備校招 Android 面試》《微信資深工程師張紹文答讀者問:T 型工程師更受大公司歡迎》《答讀者問:準備面試需要做哪些技術儲備,面試官更加關心什麼方面的技術點
  • android 傳統藍牙開發 (附示例源碼)
    傳統藍牙,自己整理了一下思路,然後寫了一個BluetoothStudy小測試程序,來運用所理解的android傳統藍牙開發技術,寫下一些心得和思路,供其他android熱愛者參考,也方便日後回顧。博客最後會附上源碼,可下載借鑑。
  • 可能是目前最全的《Android面試題及解析》(379頁)
    趁著這段時間,小夥伴們可以參考這份可能是市面上最全面的安卓面試題解析大全!從基礎到架構進階,包含了騰訊、百度、小米、阿里、樂視、美團、58、獵豹、360、新浪、搜狐等一線網際網路公司面試被問到的題目,涵蓋了初中高級安卓技術點。文章中所列主要為大綱部分,詳細內容可以在文末自行獲取哈!
  • 最新Android源碼中已有中文輸入法
    今天上午Google剛更新了android源碼,變化比較大,已經有中日文輸入法。
  • 常見面試第四題之requestLayout, invalidate和postInvalidate的異同
    今天我們來講講在面試當中最常見的,最常常被問到的第四題,近期由於小編工作比較忙碌,更新的比較緩慢還請大家見諒。我相信大家在面試當中肯定會經常被問題view的重繪的問題,比如說:怎樣重新自定義一個控制項了?
  • 《STL 源碼剖析》學習筆記之容器(一)vector
    [圖]The Container 2019-08-01這是 herongwei 的第 82 篇原創閱讀本文大概需要 6.66 分鐘前言侯捷大師的《STL源碼剖析2、vector 容器先來看看 vector 的源碼。以下是 vector 定義式的源碼摘錄。雖然 STL規定,欲使用vector者必須先含入,但 SGI STL 將 vector 實作於更底層的<stl_vector.h>。
  • [實踐] Android5.1.1源碼 - 讓某個APP以解釋執行模式運行
    /class_linker.cc」中,下面是它的源碼(這裡只列出了與本文有關的部分):ForkAndSpecializeCommon函數定義在文件」frameworks/base/core/jni/com_android_internal_os_Zygote.cpp」中,下面它的源碼:
  • Android面試題-機型適配,例如三星、小米、華為、魅族等
    android:attrs。。。。"的格式,但是Google源碼在此處用了數值,中間title的margin值所有廠商都有變動,導致自定義的Perference和默認的顯示不齊解決因為App的用戶機型比較雜,hack的方法比較不適用,故粘貼Google源碼,自己重新封裝, 自己統一所有手機PopupWindow中嵌套EditText,會出現EditText長按無法觸發「粘貼」選項,可以改成Dialog