這近兩年RxJava和Retrofit都很熱門,Android SDK4.4版本后其HttpURLConnection的內(nèi)部實(shí)現(xiàn)已經(jīng)變?yōu)镺kHttp亩钟,很多公司也在開(kāi)始嘗試使用RxJava+Retrofit+OkHttp組合做為應(yīng)用框架的根基乓梨。網(wǎng)上這類教程也遍地開(kāi)花,不管是工作幾年的Android工程師們清酥,還是在象牙塔中的準(zhǔn)工程師們都把“RxJava+Retrofit+OkHttp的組合”定為了自己的標(biāo)配扶镀。
不過(guò)問(wèn)題也就來(lái)了,如果大家的框架都是同一個(gè)組合焰轻,那么面試官怎么考察不同的面試者對(duì)這個(gè)框架的理解和應(yīng)用呢臭觉?或者換一個(gè)角度說(shuō),你作為面試者辱志,怎么樣在簡(jiǎn)歷或者面試中體現(xiàn)你對(duì)“標(biāo)配”的理解和運(yùn)用蝠筑,來(lái)突出自己呢?
面試題:你是怎么搭建Android應(yīng)用框架的揩懒?
如果問(wèn)這樣的面試題什乙,我想(我也試過(guò))很多人都會(huì)回答上面所說(shuō)的“標(biāo)配”組合,頂多再加下MVP或者M(jìn)VVM模式已球,然后就構(gòu)成了一個(gè)比較流行的應(yīng)用框架臣镣。
不可否認(rèn)這確實(shí)是一個(gè)不錯(cuò)的選擇辅愿,那么如果是我們?cè)谡线@些庫(kù)和模式成為一個(gè)框架,我們是基于什么樣的原則選擇它們的呢忆某?
RxJava
給我們的項(xiàng)目引入響應(yīng)式編程方式渠缕,讓異步方式變得更簡(jiǎn)潔,而且它的簡(jiǎn)潔與眾不同之處在于褒繁,隨著程序邏輯變得越來(lái)越復(fù)雜亦鳞,它依然能夠保持簡(jiǎn)潔。它流式編程的思想棒坏,豐富的操作符燕差,線程的任意切換等優(yōu)點(diǎn)廣受大家的喜愛(ài)。
響應(yīng)式編程是一種面向數(shù)據(jù)流和變化傳播的編程范式坝冕。這意味著可以在編程語(yǔ)言中很方便地表達(dá)靜態(tài)或動(dòng)態(tài)的數(shù)據(jù)流徒探,而相關(guān)的計(jì)算模型會(huì)自動(dòng)將變化的值通過(guò)數(shù)據(jù)流進(jìn)行傳播。
Retrofit
Retrofit是一個(gè)RESTful的Http網(wǎng)絡(luò)請(qǐng)求框架的封裝喂窟。注意這里并沒(méi)有說(shuō)它是網(wǎng)絡(luò)請(qǐng)求框架测暗,主要原因在于網(wǎng)絡(luò)請(qǐng)求的工作并不是Retrofit來(lái)完成的。
Retrofit 2.0開(kāi)始內(nèi)置OkHttp磨澡,前者專注于接口的封裝碗啄,后者專注于網(wǎng)絡(luò)請(qǐng)求的高效,二者分工協(xié)作稳摄。
而且Retrofit提供不同的Converter實(shí)現(xiàn)(也可以自定義)稚字,同時(shí)提供RxJava支持(返回Observable對(duì)象),配合Gson和RxJava厦酬,你可以用很少的代碼就實(shí)現(xiàn)請(qǐng)求胆描、返回?cái)?shù)據(jù)解析和操作等功能。
OkHttp
OkHttp是Retrofit底層使用的Http請(qǐng)求庫(kù)仗阅,都是Square公司的開(kāi)源產(chǎn)品昌讲。OkHttp是一個(gè)快速、高效的Http客戶端實(shí)現(xiàn)减噪,它幫我們完成了很多很多事情:
- 支持SPDY, 可以合并多個(gè)到同一個(gè)主機(jī)的請(qǐng)求
- 使用連接池技術(shù)減少請(qǐng)求的延遲(如果SPDY是可用的話)
- 使用GZIP壓縮減少傳輸?shù)臄?shù)據(jù)量
- 緩存響應(yīng)避免重復(fù)的網(wǎng)絡(luò)請(qǐng)求
- ......
OkHttp還提供了攔截器(Interceptors)短绸,方便我們來(lái)監(jiān)控,改寫(xiě)和重試HTTP訪問(wèn)旋廷。通過(guò)攔截器鸠按,我們很容易就能實(shí)現(xiàn)對(duì)Http的請(qǐng)求和響應(yīng)記錄到日志礼搁。
整合
如果我們直接這樣組合就認(rèn)為是一個(gè)應(yīng)用框架的話饶碘,那我認(rèn)為你還沒(méi)有真正認(rèn)識(shí)框架,或者沒(méi)有遇到稍大一點(diǎn)復(fù)雜一點(diǎn)的項(xiàng)目馒吴,所以你毫不費(fèi)力就有了自己“高大上”的框架扎运。
但是在你整合這些庫(kù)時(shí)瑟曲,你更應(yīng)該學(xué)習(xí)一下他們是怎么能無(wú)縫地對(duì)接上的,這一點(diǎn)也是我認(rèn)為可以問(wèn)面試者的一個(gè)重要的點(diǎn)豪治。
如Retrofit的解耦方式:
1洞拨、通過(guò)注解來(lái)配置請(qǐng)求參數(shù);
2负拟、通過(guò)工廠來(lái)生成CallAdapter烦衣,Converter。
- 你可以使用不同的請(qǐng)求適配器(CallAdapter)掩浙,比如RxJava花吟;
- 你可以使用不同的反序列化工具(Converter),比如Gson厨姚、protobuff等衅澈。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.github.com/api/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
Retrofit是如何做到的呢?其間的實(shí)現(xiàn)代碼值得好好看看谬墙,好在代碼量并不是很大今布,看前先學(xué)習(xí)一個(gè)Java動(dòng)態(tài)代理方面的知識(shí),也可緩解一些“痛苦”拭抬。
所以總結(jié)果一下部默,關(guān)于標(biāo)配我會(huì)這樣問(wèn):RxJava+Retrofit+OkHttp的內(nèi)部是如何整合在一起的,還有就是它們?nèi)绾魏蛿?shù)據(jù)與業(yè)務(wù)邏輯層進(jìn)行整合造虎?
看大家的熱情甩牺,也許稍后會(huì)就這個(gè)整合進(jìn)行案列展示。
小結(jié)
很多面試者只是把“RxJava+Retrofit+OkHttp”的使用做為標(biāo)配了累奈,即使你用了這個(gè)組合贬派,它對(duì)于自身的技能或者架構(gòu)能力提升其實(shí)并不大,相反因?yàn)樘菀琢伺烀剑曳庋b得比較好還會(huì)減少你遇到問(wèn)題的機(jī)會(huì)搞乏,當(dāng)然也會(huì)讓你失去提升的機(jī)會(huì)。
所以戒努,我關(guān)注怎么整合它們请敦,并學(xué)會(huì)他們整合在一起的具體方法和手段。
相關(guān)面試題
1储玫、MVP和MVVM模式:
“Android面試一天一題(Day 33:Android開(kāi)發(fā)的套路MVP & MVVM)”
2侍筛、第三方開(kāi)源庫(kù):
“Android面試一天一題(Day 32:談?wù)勈褂眠^(guò)的第三方開(kāi)源庫(kù))”