騰訊Android社招面試源碼相關,對不起還是問到三次握手.四次握手了

一、如何優化自定義View

  • 在要在onDraw或是onLayout()中去創建對象,因爲onDraw()方法可能會被頻繁調用,可以在view的構造函數中進行創建對象;
  • 降低view的刷新頻率,儘可能減少不必要的調用invalidate()方法。或是調用帶四種參數不同類型的invalidate(),而不是調用無參的方法。無參變量需要刷新整個view,而帶參數的方法只需刷新指定部分的view。在onDraw()方法中減少冗餘代碼。
  • 使用硬件加速,GPU硬件加速可以帶來性能增加。
  • 狀態保存與恢復,如果因內存不足,Activity置於後臺被殺重啓時,View應儘可能保存自己屬性,可以重寫onSaveInstanceState和onRestoreInstanceState方法,狀態保存。

二、低版本SDK如何實現高版本api?

使用@TargetApi註解·

當代碼中有比AndroidManifest中設置的android:minSdkVersion版本更高的方法,此時編譯器會提示警告,解決方法是在方法上加上@SuppressLint("NewApi")或者@TargetApi()。但它們僅是屏蔽了android lint錯誤,在方法中還要判斷版本做不同的操作。

@SuppressLint("NewApi")屏蔽一切新api中才能使用的方法報的android lint錯誤

@TargetApi() 只屏蔽某一新api中才能使用的方法報的android lint錯誤,如@TargetApi(11)如果在方法中用了只有API14纔開始有的方法,還是會報錯。

三、描述一次網絡請求的流程

1)域名解析

瀏覽器會先搜索自身DNS緩存且對應的IP地址沒有過期;若未找到則搜索操作系統自身的DNS緩存;若還未找到則讀本地的hotsts文件;還未找到會在TCP/IP設置的本地DNS服務器上找,如果要查詢的域名在本地配置的區域資源中,則完成解析;否則根據本地DNS服務器會請求根DNS服務器;根DNS服務器是13臺根DNS,會一級一級往下找。

2)TCP三次握手

客戶端先發送SYN=1,ACK=0,序列號seq=x報文;(SYN在連接建立時用來同步序號,SYN=1,ACK=0代表這是一個連接請求報文,對方若同意建立連接,則應在響應報文中使SYN=1,ACK=1)

服務器返回SYN=1,ACK=1,seq=y, ack=x+1;

客戶端再一次確認,但不用SYN了,回覆服務端, ACK=1, seq=x+1, ack=y+1

3)建立TCP連接後發起HTTP請求

客戶端按照指定的格式開始向服務端發送HTTP請求,HTTP請求格式由四部分組成,分別是請求行、請求頭、空行、消息體,服務端接收到請求後,解析HTTP請求,處理完成邏輯,最後返回一個具有標準格式的HTTP響應給客戶端。

4)服務器響應HTTP請求

服務器接收處理完請求後返回一個HTTP響應消息給客戶端,HTTP響應信息格式包括:狀態行、響應頭、空行、消息體

5)瀏覽器解析HTML代碼,請求HTML代碼中的資源

瀏覽器拿到html文件後,就開始解析其中的html代碼,遇到js/css/image等靜態資源時,向服務器發起一個http請求,如果返回304狀態碼,瀏覽器會直接讀取本地的緩存文件。否則開啓線程向服務器請求下載。
6)瀏覽器對頁面進行渲染並呈現給用戶

7)TCP的四次揮手

當客戶端沒有東西要發送時就要釋放連接(提出中斷連接可以是Client也可以是Server),客戶端會發送一個FIN=1的沒有數據的報文,進入FIN_WAIT狀態,服務端收到後會給客戶端一個確認,此時客戶端不能發送數據,但可接收信息。

四、HttpUrlConnection 和 okhttp關係

兩者都可以用來實現網絡請求,android4.4之後的HttpUrlConnection的實現是基於okhttp

  • Bitmap對象的理解
  • looper架構
  • ActivityThread,AMS,WMS的工作原理
  • 自定義View如何考慮機型適配

onMeasure()getDefaultSize()的默認實現中,當view的測量模式是AT_MOST或EXACTLY時,View的大小都會被設置成子View MeasureSpec的specSize.子view的MeasureSpec值是根據子View的佈局參數和父容器的MeasureSpec值計算得來。當子view的佈局參數是wrap_content時,對應的測量模式是AT_MOST,大小是parentSize,

  • 自定義View的事件
  • AstncTask+HttpClient 與 AsyncHttpClient有什麼區別?
  • LaunchMode應用場景
  • AsyncTask 如何使用?
  • SpareArray原理
  • 請介紹下ContentProvider 是如何實現數據共享的?
  • AndroidService與Activity之間通信的幾種方式
  • IntentService原理及作用是什麼?

原理:IntentService是繼承Service的一個抽象類,它在onCreate()方法中創建了一個HandlerThread,並啓動該線程。HandlerThread是帶有自己消息隊列和Looper的線程,根據HandlerThreadlooper創建一個Handler,這樣IntentServiceServiceHandlerhandleMessage()方法就運行在子線程中。handleMessage中調用了onHandleIntent()方法,它是一個抽象方法,繼承IntentService類需要實現該方法,把耗時操作放在onHandleIntent()方法中,等耗時操作運行完成後,會調用stopSelf()方法,服務會調用onDestory()方法消毀自己。如果onHandleIntent()中的耗時操作未運行完前就調用了stopSelf()方法,服務調用onDestory()方法,但耗時操作會繼續運行,直至運行完畢。如果同時多次啓動IntentService,任務會放在一個隊列中,onCreate()onDestory()方法都只會運行一次。

作用:用來處理後臺耗時操作,如讀取數據庫或是本地文件等。

  • 說說Activity、Intent、Service 是什麼關係
  • ApplicationContext和ActivityContext的區別
  • SP是進程同步的嗎?有什麼方法做到同步?
  • 談談多線程在Android中的使用
  • 進程和 Application 的生命週期
  • 封裝View的時候怎麼知道view的大小
  • RecycleView原理
  • AndroidManifest的作用與理解

漫漫開發之路,我們只是其中的一小部分……只有不斷的學習、進階,纔是我們的出路!纔跟得上時代的進步!

今年年初我花一個月的時間收錄整理了一套知識體系,如果有想法深入的系統化的去學習的,可以私信我【學習】,我會把我收錄整理的資料都送給大家,幫助大家更快的進階。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章