妥妥的去面試之Android基礎(六)

樹獺非懶發表於2019-03-06

筆者由於在近期需要找工作,所以近期最主要的任務就是準備面試,不打無準備之仗。只有你準備充分了,那麼你想得到的機會才可能有機會入你懷中。

筆者會將準備面試的學習過程記錄下來,方便自己覆盤的同時也希望能給一道找工作的小夥伴們一些幫助。筆者準備的內容大綱如下

Android面試大綱.png

妥妥的去面試之Android基礎(一)

妥妥的去面試之Android基礎(二)

妥妥的去面試之Android基礎(三)

妥妥的去面試之Android基礎(四)

妥妥的去面試之Android基礎(五)

關於Android基礎篇部分,不出意外的話這篇應該是終結篇了~~

那麼上最後的正菜吧

談談你對MVC、MVP和MVVM的理解

MVC分三個層

  • 檢視層(View):對應於xml佈局檔案和java程式碼動態view部分。
  • 控制層(Controller):MVC中Android的控制層是由Activity來承擔的,Activity作為初始化頁面,展示資料的操作。但是因為XML檢視功能太弱,所以Activity既要負責檢視的顯示又要加入控制邏輯,承擔的功能過多。
  • 模型層(Model):針對業務模型,建立資料結構和相關的類,它主要負責網路請求,資料庫處理,I/O的操作。

總結:

具有一定的分層,model徹底解耦,controller和view並沒有解耦。Controller既要承擔頁面的初始化又要處理控制邏輯,承擔的功能過多,其程式碼量也會過多。Model和View要直接互動,它們耦合度依然更高。

MVP

MVP在MVC的基礎上,引入了中間層Present把Model和View層徹底解耦,由Present來控制邏輯,解決了MVC中Controller和View分不清的問題。但是隨著業務邏輯的增加,一個頁面可能會非常複雜,UI的改變是非常多,會有非常多的case,這樣就會造成View的介面會很龐大。

MVVM

MVP中我們說過隨著業務邏輯的增加,UI的改變多的情況下,會有非常多的跟UI相關的case,這樣就會造成View的介面會很龐大。而MVVM就解決了這個問題,通過雙向繫結的機制,實現資料和UI內容,只要想改其中一方,另一方都能夠及時更新的一種設計理念,這樣就省去了很多在View層中寫很多case的情況,只需要改變資料就行。

MVVM與DataBinding的關係?

MVVM是一種思想,DataBinding是谷歌推出的方便實現MVVM的工具。 看起來MVVM很好的解決了MVC和MVP的不足,但是由於資料和檢視的雙向繫結,導致出現問題時不太好定位來源,有可能資料問題導致,也有可能業務邏輯中對檢視屬性的修改導致。如果專案中打算用MVVM的話可以考慮使用官方的架構元件ViewModel、LiveData、DataBinding去實現MVVM。

三者如何選擇?

  • 如果專案簡單,沒什麼複雜性,未來改動也不大的話,那就不要用設計模式或者架構方法,只需要將每個模組封裝好,方便呼叫即可,不要為了使用設計模式或架構方法而使用。
  • 對於偏向展示型的app,絕大多數業務邏輯都在後端,app主要功能就是展示資料,互動等,建議使用mvvm。
  • 對於工具類或者需要寫很多業務邏輯app,使用mvp或者mvvm都可。

HttpClient和HttpUrlConnection的區別?

  • HttpClient適用於web瀏覽器,擁有大量靈活的API,實現起來比較穩定,且其功能比較豐富,提供了很多工具,封裝了http的請求頭。但在不破壞相容性的前提下,其龐大的API也使人難以改進。於是在Android 6.0中拋棄了HttpClient,替換成OkHttp。
  • HttpUrlConnection它的API簡單,體積較小,因而非常適用於Android專案。壓縮和快取機制可以有效地減少網路訪問的流量,在提升速度和省電方面也起到了較大的作用。對於新的應用程式應該使用HttpURLConnection。

invalidate和requestLayout的區別及使用?

  • invalidate():是自定義View 的時候,重新執行onDraw()方法,當view只在內容和可見度方面發生變化時呼叫。

  • requeLayout() : 他跟invalidate()相反,他只呼叫measure()和layout()過程,不會呼叫draw()。

如果需要區域性重新整理怎麼辦?

使用 requestFocus()方法,他只重新整理你要重新整理的地方。

Android對HashMap做了優化後推出的新的容器類是什麼?

比如使用了SparseArray、ArrayMap用來代替HashMap。它們在有些情況下能帶來更好的效能提升。

SparseArray

SparseArray比HashMap更省記憶體,在某些條件下效能更好,主要是因為它避免了對key的自動裝箱(int轉為Integer型別),它內部則是通過兩個陣列來進行資料儲存的,一個儲存key,另外一個儲存value,為了優化效能,它內部對資料還採取了壓縮的方式來表示稀疏陣列的資料,從而節約記憶體空間。

SparseArray在儲存和讀取資料時候,使用的是二分查詢法。

滿足下面兩個條件我們可以使用SparseArray代替HashMap

  • 資料量不大,最好在千級以內
  • key必須為int型別,這中情況下的HashMap可以用SparseArray代替

建議與此篇部落格共同食用 Android記憶體優化(使用SparseArray和ArrayMap代替HashMap)

面試系列的文章都放於 面試妥妥的 建議小夥伴們關注該專題

相關文章