軟件架構(gòu)
MVC | MVP | MVVM | |
---|---|---|---|
介紹 | Model:數(shù)據(jù)結(jié)構(gòu)相關(guān)的類 View:XML文件 Controller:Activity |
view:Activity聊闯,F(xiàn)ragment,Adapter等直接和UI相關(guān)的類 Model:數(shù)據(jù)結(jié)構(gòu)和操作相關(guān)的類 Presenter:作為View與Model交互的中間紐帶米诉,處理與用戶交互的業(yè)務(wù)邏輯 iew interface:需要View實(shí)現(xiàn)的接口菱蔬,View通過(guò)View interface與Presenter進(jìn)行交互 |
MVVM可以算是MVP的升級(jí)版,Model和View類似MVP VM是ViewModel的縮寫(xiě),ViewModel可以理解成是View的數(shù)據(jù)模型和Presenter的合體 |
優(yōu)點(diǎn) | 代碼結(jié)構(gòu)簡(jiǎn)單 | view層和model層分離 可將一個(gè)Presenter用于多個(gè)視圖 方便單元測(cè)試 |
用戶直接交互的是View View和ViewModel是多對(duì)一的關(guān)系 View和ViewModel的雙向數(shù)據(jù)綁定 |
缺點(diǎn) | xml作為view層,可控性較差 view層和model層存在耦合 Activity代碼臃腫 |
由于通過(guò)接口進(jìn)行控制,接口粒度不好控制 UI驅(qū)動(dòng),要考慮線程及生命周期 V層和P層存在耦合 復(fù)雜業(yè)務(wù)也會(huì)導(dǎo)致P層代碼臃腫 |
由于去除了Presenter層拴泌,會(huì)導(dǎo)致view層依然過(guò)重 |
網(wǎng)絡(luò)加載框架
HTTP客戶端
HttpClient | HttpURLConnection | OkHttp | |
---|---|---|---|
介紹 | Apache的一個(gè)三方網(wǎng)絡(luò)框架 | 一個(gè)多用途魏身、輕量級(jí)的http客戶端 | Square 公司封裝的一個(gè)高性能 http 請(qǐng)求庫(kù) |
優(yōu)點(diǎn) | 網(wǎng)絡(luò)請(qǐng)求做了完善的封裝,api眾多蚪腐,用起來(lái)比較方便箭昵,開(kāi)發(fā)快。實(shí)現(xiàn)比較穩(wěn)定回季,bug比較少 | 由于API比較簡(jiǎn)單家制,使得我們可以更加容易的去使用和拓展它 | 鏈接復(fù)用 Response 緩存和 Cookie 默認(rèn) GZIP 請(qǐng)求失敗自動(dòng)重連 DNS 擴(kuò)展 Http2/SPDY/WebSocket協(xié)議支持 |
缺點(diǎn) | 由于其api眾多,是我們很難再不破壞兼容性的情況下對(duì)其進(jìn)行擴(kuò)展泡一,在android5.0被廢棄颤殴,6.0逐漸刪除 | 它對(duì)網(wǎng)絡(luò)請(qǐng)求的封裝沒(méi)有HttpClient徹底,api比較簡(jiǎn)單鼻忠,用起來(lái)沒(méi)有那么方便 | okhttp請(qǐng)求網(wǎng)絡(luò)切換回來(lái)是在線程里面的涵但,不是在主線程,不能直接刷新UI帖蔓,需要我們手動(dòng)處理矮瘟。封裝比較麻煩 |
總結(jié):Android2.3以前適合使用HttpClient,而2.3以后適用于OkHttp塑娇,HttpURLConnection在Android4.4以后已將底層改用OkHttp,但是OkHttp使用時(shí)需要進(jìn)行一層封裝
封裝框架
volley | Retrofit | |
---|---|---|
介紹 | 一個(gè)簡(jiǎn)單的異步http庫(kù) | Square 公司出品的默認(rèn)基于 OkHttp 封裝的一套 RESTful 網(wǎng)絡(luò)請(qǐng)求框架 |
優(yōu)點(diǎn) | 支持圖像加載 自帶緩存澈侠,支持自定義請(qǐng)求 輕量級(jí)網(wǎng)絡(luò)交互,適合大量的钝吮,小數(shù)據(jù)傳輸埋涧。 |
徹底解耦 默認(rèn)使用 OkHttp ,性能上要比 Volley 占優(yōu)勢(shì) 支持同步奇瘦、異步和RxJava |
缺點(diǎn) | 不支持 post 大數(shù)據(jù),不適合上傳文件 圖片加載性能一般 |
比較高的門(mén)檻 |
總結(jié):volley使用簡(jiǎn)單劲弦,適合用于多次的小數(shù)據(jù)傳輸耳标;Retrofit適用范圍較廣,API使用簡(jiǎn)單邑跪,但有一定使用門(mén)檻次坡,配合RxJava使用更佳
圖片加載框架
Glide | Picasso | Fresco | |
---|---|---|---|
介紹 | 2014年 Google 員工的開(kāi)源項(xiàng)目 | 2013年 Square 開(kāi)源的項(xiàng)目 | 2015年Facebook開(kāi)源的圖片框架 |
優(yōu)點(diǎn) | 可接受Activity/fragment的context,控制生命周期 支持git 支持okhttp画畅,Volley 內(nèi)存友好 2級(jí)緩存 |
自帶統(tǒng)計(jì)監(jiān)控功能 使用復(fù)雜的圖片壓縮轉(zhuǎn)換來(lái)盡可能的減少內(nèi)存消耗 |
圖片的漸進(jìn)式呈現(xiàn) 圖片存儲(chǔ)在安卓系統(tǒng)的匿名共享內(nèi)存,無(wú)OOM 很好的支持 GIF 自定義居中焦點(diǎn) |
缺點(diǎn) | 大小和方法數(shù)均大于Picasso(500k和2678) | 不支持git 無(wú)自動(dòng)控制生命周期 2級(jí)緩存 |
包較大(2~3M) 使用復(fù)雜 |
總結(jié):Glide除了包較大幾乎擁有Picasso的所有優(yōu)點(diǎn)砸琅,比較適合非專業(yè)的應(yīng)用中的圖片處理;Fresco擁有前面兩個(gè)庫(kù)的優(yōu)點(diǎn)轴踱,但它的包很大症脂,且使用門(mén)檻較高,比較適用于圖片需求較大的應(yīng)用