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

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

筆者會將準備面試的學(xué)習(xí)過程記錄下來,方便自己復(fù)盤的同時也希望能給一道找工作的小伙伴們一些幫助。筆者準備的內(nèi)容大綱如下

Android面試大綱.png

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

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

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

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

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

關(guān)于Android基礎(chǔ)篇部分,不出意外的話這篇應(yīng)該是終結(jié)篇了~~

那么上最后的正菜吧

談?wù)勀銓VC、MVP和MVVM的理解

MVC分三個層

  • 視圖層(View):對應(yīng)于xml布局文件和java代碼動態(tài)view部分。
  • 控制層(Controller):MVC中Android的控制層是由Activity來承擔(dān)的,Activity作為初始化頁面,展示數(shù)據(jù)的操作。但是因為XML視圖功能太弱,所以Activity既要負責(zé)視圖的顯示又要加入控制邏輯,承擔(dān)的功能過多。
  • 模型層(Model):針對業(yè)務(wù)模型,建立數(shù)據(jù)結(jié)構(gòu)和相關(guān)的類,它主要負責(zé)網(wǎng)絡(luò)請求,數(shù)據(jù)庫處理,I/O的操作。

總結(jié):

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

MVP

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

MVVM

MVP中我們說過隨著業(yè)務(wù)邏輯的增加,UI的改變多的情況下,會有非常多的跟UI相關(guān)的case,這樣就會造成View的接口會很龐大。而MVVM就解決了這個問題,通過雙向綁定的機制,實現(xiàn)數(shù)據(jù)和UI內(nèi)容,只要想改其中一方,另一方都能夠及時更新的一種設(shè)計理念,這樣就省去了很多在View層中寫很多case的情況,只需要改變數(shù)據(jù)就行。

MVVM與DataBinding的關(guān)系?

MVVM是一種思想,DataBinding是谷歌推出的方便實現(xiàn)MVVM的工具。
看起來MVVM很好的解決了MVC和MVP的不足,但是由于數(shù)據(jù)和視圖的雙向綁定,導(dǎo)致出現(xiàn)問題時不太好定位來源,有可能數(shù)據(jù)問題導(dǎo)致,也有可能業(yè)務(wù)邏輯中對視圖屬性的修改導(dǎo)致。如果項目中打算用MVVM的話可以考慮使用官方的架構(gòu)組件ViewModel、LiveData、DataBinding去實現(xiàn)MVVM。

三者如何選擇?

  • 如果項目簡單,沒什么復(fù)雜性,未來改動也不大的話,那就不要用設(shè)計模式或者架構(gòu)方法,只需要將每個模塊封裝好,方便調(diào)用即可,不要為了使用設(shè)計模式或架構(gòu)方法而使用。
  • 對于偏向展示型的app,絕大多數(shù)業(yè)務(wù)邏輯都在后端,app主要功能就是展示數(shù)據(jù),交互等,建議使用mvvm。
  • 對于工具類或者需要寫很多業(yè)務(wù)邏輯app,使用mvp或者mvvm都可。

HttpClient和HttpUrlConnection的區(qū)別?

  • HttpClient適用于web瀏覽器,擁有大量靈活的API,實現(xiàn)起來比較穩(wěn)定,且其功能比較豐富,提供了很多工具,封裝了http的請求頭。但在不破壞兼容性的前提下,其龐大的API也使人難以改進。于是在Android 6.0中拋棄了HttpClient,替換成OkHttp。
  • HttpUrlConnection它的API簡單,體積較小,因而非常適用于Android項目。壓縮和緩存機制可以有效地減少網(wǎng)絡(luò)訪問的流量,在提升速度和省電方面也起到了較大的作用。對于新的應(yīng)用程序應(yīng)該使用HttpURLConnection。

invalidate和requestLayout的區(qū)別及使用?

  • invalidate():是自定義View 的時候,重新執(zhí)行onDraw()方法,當view只在內(nèi)容和可見度方面發(fā)生變化時調(diào)用。

  • requeLayout() : 他跟invalidate()相反,他只調(diào)用measure()和layout()過程,不會調(diào)用draw()。

如果需要局部刷新怎么辦?

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

Android對HashMap做了優(yōu)化后推出的新的容器類是什么?

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

SparseArray

SparseArray比HashMap更省內(nèi)存,在某些條件下性能更好,主要是因為它避免了對key的自動裝箱(int轉(zhuǎn)為Integer類型),它內(nèi)部則是通過兩個數(shù)組來進行數(shù)據(jù)存儲的,一個存儲key,另外一個存儲value,為了優(yōu)化性能,它內(nèi)部對數(shù)據(jù)還采取了壓縮的方式來表示稀疏數(shù)組的數(shù)據(jù),從而節(jié)約內(nèi)存空間。

SparseArray在存儲和讀取數(shù)據(jù)時候,使用的是二分查找法。

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

  • 數(shù)據(jù)量不大,最好在千級以內(nèi)
  • key必須為int類型,這中情況下的HashMap可以用SparseArray代替

建議與此篇博客共同食用 Android內(nèi)存優(yōu)化(使用SparseArray和ArrayMap代替HashMap)

面試系列的文章都放于 面試妥妥的 建議小伙伴們關(guān)注該專題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 基礎(chǔ) 不管是Android基礎(chǔ)還是Java基礎(chǔ)以及常見的數(shù)據(jù)結(jié)構(gòu),這些是無原則地必須要熟練掌握的,尤其是非計算機專...
    JxMY閱讀 2,863評論 2 48
  • 前言 談起MVC,MVP和MVVM這三個最耳熟能詳?shù)腁ndroid框架,相信大家對它們都不陌生,但在實際的情況下,...
    ghroost閱讀 4,017評論 0 40
  • Android基礎(chǔ)及相關(guān)機制 Android Context 上下文 你必須知道的一切 Android中子線程真的...
    楷桐閱讀 2,102評論 1 30
  • 整理一些常見的Android面試題(針對于2~3年開發(fā)經(jīng)驗中所遇到的問題) synchronized鎖靜態(tài)方法和非...
    appzy閱讀 2,448評論 4 18
  • 轉(zhuǎn)載至:http://www.itdecent.cn/p/9a6845b26856 “Android MVP 詳解...
    SnowDragonYY閱讀 10,409評論 5 241

友情鏈接更多精彩內(nèi)容