Android面試一天一題(Day 32:談?wù)勈褂眠^(guò)的第三方開(kāi)源庫(kù))

在大家多年的開(kāi)發(fā)經(jīng)歷中,恐怕一定會(huì)被告知過(guò)這句話:“不要重復(fù)造輪子 ”。如果網(wǎng)上已有現(xiàn)成的解決方案或者開(kāi)源庫(kù),大多數(shù)時(shí)候并不建議重新開(kāi)發(fā)。如果你經(jīng)常愛(ài)在網(wǎng)上搜索,你可能會(huì)發(fā)現(xiàn),其實(shí)大多數(shù)你要實(shí)現(xiàn)的功能都已經(jīng)有人實(shí)現(xiàn)過(guò)并開(kāi)源了,沒(méi)找到只是你不太會(huì)用搜索引擎而已。

在Android開(kāi)發(fā)中,有很多優(yōu)秀的“輪子”可供開(kāi)發(fā)人員選擇,那么怎么選怎么用就是問(wèn)題了,所以在面試中我很喜歡問(wèn)這種在使用第三方開(kāi)源庫(kù)時(shí)遇到的問(wèn)題。

面試題:談?wù)勀闶褂眠^(guò)的Android開(kāi)源庫(kù),是否有遇到過(guò)什么問(wèn)題?

前段時(shí)間和京東的一位Android工程師在聊使用第三方庫(kù)的問(wèn)題,他也喜歡問(wèn)面試者在使用第三方庫(kù)時(shí)有遇到什么問(wèn)題和解決的方案,他給我舉了個(gè)關(guān)于網(wǎng)絡(luò)請(qǐng)求庫(kù)OKHttp的例子(OKHttp這個(gè)開(kāi)源框架處理請(qǐng)求轉(zhuǎn)發(fā)時(shí)會(huì)有問(wèn)題)。如果對(duì)方在網(wǎng)絡(luò)開(kāi)發(fā)上很有經(jīng)驗(yàn),比如像他們做電商移動(dòng)應(yīng)用的,是很容易遇到這樣的問(wèn)題。

前幾年在一個(gè)項(xiàng)目中,我有使用EventBus事件總線框架做為應(yīng)用UI和邏輯溝通的橋梁,后來(lái)也發(fā)現(xiàn)并不像我想象中的好用。太多的消息事件會(huì)讓代碼的可讀性和可維護(hù)性降低,當(dāng)時(shí)EventBus還使用反射的方式實(shí)現(xiàn),性能上也有一定的消耗(EventBus升級(jí)3.0以后事件的訂閱已經(jīng)從方法名換成了注解的方式)。

EventBus是一款針對(duì)Android優(yōu)化的發(fā)布/訂閱事件總線(內(nèi)部是觀察者設(shè)計(jì)模式)。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優(yōu)點(diǎn)是開(kāi)銷(xiāo)小,代碼更優(yōu)雅。以及將發(fā)送者和接收者解耦。

當(dāng)然,?每個(gè)人遇到的問(wèn)題都不一樣,有些別人用著很正常的開(kāi)源庫(kù)你用著就可能會(huì)出問(wèn)題。比如我遇到的Glide圖片加載庫(kù)在初始化Glide實(shí)例時(shí)寫(xiě)死了Context的問(wèn)題,在一般的應(yīng)用中這樣做并不會(huì)出現(xiàn)問(wèn)題,但在插件框架上就會(huì)因?yàn)檫@個(gè)Context被寫(xiě)死就會(huì)導(dǎo)致插件資源錯(cuò)亂的問(wèn)題。

Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView);

Glide在初始化時(shí)記錄了一個(gè)Context做為其內(nèi)部使用,之后雖然每次都會(huì)通過(guò)“with(this)”傳入一個(gè)Context,但這個(gè)新的Context卻不會(huì)被使用。

還有一些項(xiàng)目中使用ORM(對(duì)象關(guān)系映射)的數(shù)據(jù)庫(kù)框架,如AFinal、GreenDao,有些框架在多線程操作數(shù)據(jù)時(shí)會(huì)鎖住整個(gè)表(在ORM的概念里,其實(shí)就是Dao類(lèi)),導(dǎo)致在初始化時(shí)因?yàn)樽泳€程在鎖住某個(gè)類(lèi)阻塞了UI線程的數(shù)據(jù)表操作。

如果沒(méi)有問(wèn)題呢?

可不可以在使用第三方開(kāi)源庫(kù)時(shí),就是沒(méi)有問(wèn)題呢?當(dāng)然可以,不過(guò)你可以聊一聊你為什么要選擇這個(gè)庫(kù),其實(shí)就是從側(cè)面來(lái)說(shuō)明:你對(duì)這個(gè)庫(kù)的優(yōu)缺點(diǎn)的看法,以及你是否了解它的實(shí)現(xiàn)原理,因?yàn)槟阋獙?duì)自己的項(xiàng)目負(fù)責(zé)(開(kāi)源作者可不需要)。

小結(jié)

這里舉了幾個(gè)小例子,還有很多優(yōu)秀的開(kāi)源框架。其實(shí)很多程序員的問(wèn)題是很少使用開(kāi)源庫(kù)或者框架,除了圖片加載庫(kù)是必備之外,其他的開(kāi)源庫(kù)很多人就不一定會(huì)使用了,自然也不會(huì)遇到什么問(wèn)題。

為什么我會(huì)比較看重這一點(diǎn)呢?因?yàn)椋矣X(jué)得第三方的開(kāi)源庫(kù),你不一定要在自己的項(xiàng)目中使用,但你一定要去學(xué)習(xí)別人是怎么寫(xiě)這個(gè)庫(kù)的,是不是比你的方法更好,而且很多流行的開(kāi)源庫(kù)都是一些Android大牛寫(xiě)的,直接讀和修改他們的代碼是你接近他們最簡(jiǎn)單的方式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容