教你寫Android網(wǎng)絡(luò)框架之基本架構(gòu)
來(lái)源:程序員人生 發(fā)布時(shí)間:2015-02-07 09:03:19 閱讀次數(shù):2892次
轉(zhuǎn)載請(qǐng)注明出處,本文來(lái)自【 Mr.Simple的博客 】。
我正在參加博客之星,點(diǎn)擊這里投我1票吧,謝謝~
前言
在前段時(shí)間,偶然參加了博客之星的評(píng)選,也偶然的進(jìn)入到了鴻洋和任玉剛兩知名博主的開發(fā)群,感遭到了很濃厚的技術(shù)探討氛圍,因而自己也冒出了寫1些系列博客的想法。雖然說(shuō)本人水平有限,但是也希望自己的博客能夠幫到1些需要幫助的人。需要你是高手,那末明顯不合適你,就沒有必要再看下去了。如果你對(duì)框架開發(fā)或說(shuō)Android網(wǎng)絡(luò)要求不是很了解,每次要使用網(wǎng)絡(luò)時(shí)都要到百度搜索1番,那末著多是你需要的。
在開發(fā)進(jìn)程中,網(wǎng)絡(luò)是我們很重要的1部份,因此我們就以網(wǎng)絡(luò)框架或說(shuō)網(wǎng)絡(luò)模塊開始。在這個(gè)框架開發(fā)進(jìn)程中,我會(huì)整理開發(fā)思路、和遇到1些設(shè)計(jì)問題時(shí)會(huì)有怎樣樣的斟酌、解決方案,固然這只是我個(gè)人的觀點(diǎn),大家也能夠有自己的實(shí)現(xiàn)。除網(wǎng)絡(luò)框架,后續(xù)的系列還想更新ImageLoader框架、ORM框架,如果有時(shí)間也會(huì)增加動(dòng)畫框架和微博開發(fā)的系列文章。固然這些框架只是1些簡(jiǎn)單的框架基礎(chǔ),本人水平、時(shí)間有限,而且已有現(xiàn)成、成熟的很多框架,我們?cè)谶@里只是以重復(fù)造輪子的態(tài)度去學(xué)習(xí)輪子構(gòu)建進(jìn)程,從而到達(dá)能夠造輪子的地步。至于很多細(xì)節(jié)的問題,我們這里就補(bǔ)過(guò)量討論了,如果有興趣,各位可以自行研究。
最后,我們暫且把這個(gè)框架命名為Simple_Net_Framework,下面我們1起進(jìn)入主題吧。
基本結(jié)構(gòu)
圖1 ( Simple_Net_Framework的基本結(jié)構(gòu) )
SimpleNet框架的基本結(jié)構(gòu)類似于Volley,包括1些命名上也有跟Volley1致。它主要分為4個(gè)部份,最上面的部份為Request,即各種要求類型。例如返回的數(shù)據(jù)類型為json的對(duì)應(yīng)為JsonRequest,返回?cái)?shù)據(jù)字符串的為StringRequest,如果需要上傳文件,那末你需要使用MultipartRequest,該要求只支持小文件的上傳,如果上傳的文件過(guò)大則會(huì)產(chǎn)生OOM。
第2部份為消息隊(duì)列,消息隊(duì)列保護(hù)了提交給網(wǎng)絡(luò)框架的要求列表,并且根據(jù)相應(yīng)的規(guī)則進(jìn)行排序。默許情況下更具優(yōu)先級(jí)和進(jìn)入隊(duì)列的順序來(lái)履行,該隊(duì)列使用的是線程安全的PriorityBlockingQueue<E>,由于我們的隊(duì)列會(huì)被并發(fā)的訪問,因此需要保證訪問的原子性。
第3部份是Executor,也就是網(wǎng)絡(luò)的履行者。該Executor繼承自Thread,在run方法中循環(huán)訪問第2部份的要求隊(duì)列,要求完成以后將結(jié)果投遞給UI線程。為了更好的控制要求隊(duì)列,例如要求排序、取消等操作,這里我們并沒有使用線程池來(lái)操作,而是自行管理隊(duì)列和Thread的情勢(shì),這樣全部結(jié)構(gòu)也變得更加靈活。
第4部份則是Response投遞類,在第3部份的Executor中履行網(wǎng)絡(luò)要求,Executor是Thread,但是我們其實(shí)不能在主線程中更新UI,因此我們使用
ResponseDelivery來(lái)封裝Response的投遞,保證Response履行在UI線程。
每一個(gè)部份職責(zé)都相對(duì)單1,這樣便于往后的升級(jí)和保護(hù)。
框架分析
圖1中看起來(lái)有點(diǎn)像是分層架構(gòu),其實(shí)不是,這個(gè)圖更多的是表達(dá)了它的邏輯順序,而不是結(jié)構(gòu)。而在我們的利用開發(fā)中,分層架構(gòu)是1個(gè)重要的手段,如圖2所示。
圖2
但在開發(fā)進(jìn)程中,我們常常會(huì)把UI和業(yè)務(wù)層耦合起來(lái),由于它們的關(guān)系太密切了,分解起來(lái)其實(shí)不是那末容易。高手能夠把復(fù)雜的事情簡(jiǎn)單化,而分解就是簡(jiǎn)單化的重要手段,分解這個(gè)進(jìn)程在開發(fā)進(jìn)程中我們成為重構(gòu)。但是如何分離UI和業(yè)務(wù)層也是本人最近想學(xué)習(xí)的,如果各位有好的解決方案,還希望多多指教。
那末我們就引入了1個(gè)分層概念,為了便于理解你也能夠依照如圖1的結(jié)構(gòu)來(lái)加深理解。那末分層有甚么優(yōu)缺點(diǎn)呢?
優(yōu)點(diǎn):
1、復(fù)雜問題分解簡(jiǎn)單化,每層負(fù)責(zé)自己的實(shí)現(xiàn),并向外提供服務(wù);
2、職責(zé)分離,復(fù)雜的系統(tǒng)都有很多人員進(jìn)行開發(fā),這些功能開發(fā)的管理和集成是個(gè)很嚴(yán)重的問題,分層設(shè)計(jì)實(shí)現(xiàn)以后,每層只需定義好自己的對(duì)外接口,其他依賴層服務(wù)的就能夠進(jìn)行開發(fā);
3、每層對(duì)其他層都是獨(dú)立的,對(duì)外隱藏實(shí)現(xiàn)細(xì)節(jié),上層無(wú)需知道下層的細(xì)節(jié),只需調(diào)用接口便可;
4、有益于標(biāo)準(zhǔn)化。
缺點(diǎn):
1、分層以后對(duì)領(lǐng)域業(yè)務(wù)的修改有可能需要修改很多層;
2、過(guò)量的層次影響性能。
如上所說(shuō),我們的Simple_Net_Framework其實(shí)不是分層的,而是簡(jiǎn)單的模塊化,但是理論基礎(chǔ)都是類似的,依賴于抽象而不依賴于實(shí)現(xiàn)、單1職責(zé)......這里引入分層的概念,這是便于理解,同時(shí)也是希望大家在開發(fā)進(jìn)程中能夠盡可能保證模塊的內(nèi)聚性、耦合性。
再看Simple_Net_Framework,Request是1個(gè)抽象的泛型類,泛型類型就是返回的Response類型,例如StringRequest就是繼承自Request<String>。第2部份的RequestQueue依賴于Request,Request是抽象的,因此任何Request的子類都可以傳遞到要求隊(duì)列中來(lái),它依賴的是抽象Request,而不是具體的某個(gè)實(shí)現(xiàn),因此保證了可擴(kuò)大性。你可以自己實(shí)現(xiàn)自己所需的Request,例如大文件的上傳Request。同理,第3部份的NetworkExecutor也只是依賴于Request抽象,但這里又引入了1個(gè)類型HttpStack,這個(gè)網(wǎng)絡(luò)要求的真正履行者,有HttpClientStack和HttpUrlConnStack,二者分別為Apache的HttpClient和java的HttpURLConnection,關(guān)于這二者的區(qū)分請(qǐng)參考:Android訪問網(wǎng)絡(luò),使用HttpURLConnection還是HttpClient?。HttpStack也是1個(gè)抽象,具體使用HttpClient還是HttpURLConnection則由運(yùn)行系統(tǒng)版本來(lái)定,HttpStackFactory會(huì)根據(jù)系統(tǒng)版本給框架返回對(duì)應(yīng)的HttpStack。最后的ResponseDelivery比較簡(jiǎn)單了,只是通過(guò)Handler將結(jié)果投遞給UI線程履行,也就是履行RequestListener的onComplete方法,此時(shí)網(wǎng)絡(luò)履行完成,用戶便可在該方法中更新UI或相干的其他的操作。
下面我們?cè)倏纯碨impleNet的工程結(jié)構(gòu),如圖3所示。
圖3 圖4
這就是Simple_Net_Framework框架的基本結(jié)構(gòu)了,如果期待下1篇博客的更新,就請(qǐng)頂個(gè)帖吧!謝謝~
我正在參加博客之星,點(diǎn)擊這里投我1票吧,謝謝~
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)