Android開(kāi)發(fā)必備庫(kù)
UniversalImageLoader
Android SDK的特點(diǎn)是開(kāi)放、簡(jiǎn)單、基礎(chǔ),你可以在上面自由創(chuàng)造,但現(xiàn)成的東西就很少了,比如剛開(kāi)始接觸Android的時(shí)筆者驚訝于ImageView竟然不能設(shè)置來(lái)源一張網(wǎng)絡(luò)圖片甚至SD卡上的圖片作為來(lái)源,對(duì)于習(xí)慣了前端開(kāi)發(fā)的人這確實(shí)難以接收,后來(lái)理解到圖片的下載、緩存、解碼、錯(cuò)誤處理、縮放裁剪這里面每個(gè)環(huán)節(jié)都會(huì)有很多種情況,如果單純地設(shè)置一個(gè)src屬性就將其靈活性局限了,此外ImageView畢竟是一個(gè)視圖類,做一些I/O、耗資源的粗活還得自己管理線程也不合適,也就接受了這種“自己動(dòng)手豐衣足食”的理念。
所以在之前的項(xiàng)目開(kāi)發(fā)中真的就自己動(dòng)手實(shí)現(xiàn)了一個(gè)叫RemoteImageDownloader的類,其中歷經(jīng)曲折真是不堪回首,既考慮到相同URL同時(shí)只下載一次、緩存、錯(cuò)誤和重試機(jī)制,又要考慮到多個(gè)請(qǐng)求時(shí)如何管理隊(duì)列,更痛苦的是還得防止同時(shí)解碼多個(gè)圖片、必要時(shí)downsample以防內(nèi)存超過(guò)限制……在整個(gè)開(kāi)發(fā)過(guò)程中不斷為其添磚加瓦,直到完善后才發(fā)現(xiàn)Github上有一款叫做UniversalImageLoader的庫(kù),真是相見(jiàn)恨晚、淚流滿面啊,幾乎又做了一個(gè)RemoteImageDownloader,雖然對(duì)于項(xiàng)目來(lái)說(shuō)它更符合應(yīng)用場(chǎng)景,但讓項(xiàng)目來(lái)適應(yīng)這個(gè)穩(wěn)定、專人維護(hù)且被眾多主流應(yīng)用使用的庫(kù)顯然是更明智的選擇。
參考地址:https://github.com/nostra13/Android-Universal-Image-Loader
Android Asynchronous Http Client
如果你開(kāi)發(fā)的項(xiàng)目需要調(diào)用Restful API,那一定離不了異步HTTP請(qǐng)求、持久化Cookie存儲(chǔ)、處理多文件上傳、GZIP壓縮和各種I/O錯(cuò)誤處理。異步請(qǐng)求通過(guò)AsyncTask可以解決,但線程不好管理,所以更常見(jiàn)的是Thread+Handler的模式,通過(guò)定義不同的Message來(lái)區(qū)分處理成功請(qǐng)求、連接超時(shí)、無(wú)法連接到網(wǎng)絡(luò)、服務(wù)器繁忙,在RequestHeader中自動(dòng)加上GzipHeader,同時(shí)給OutputSteram自動(dòng)套上GzipOutputStream,根據(jù)參數(shù)類型去組織Multipart或普通POST、用Preference去固化存儲(chǔ)Cookie等等,將它們?nèi)糠庋b在一起,筆者就打造了一個(gè)名為ApiRequest類HTTP處理類,也是隨著項(xiàng)目的進(jìn)展不斷完善添磚加瓦,包括引入Activity Based的概念以便在finish activity之后就自動(dòng)關(guān)閉連接等特性。再后來(lái)發(fā)生的事情想必大家都知道了:有一天遇到了Android Asynchronous Http Client,這款I(lǐng)nstagram、Pinterest都在用的庫(kù),再一次讓我欲哭無(wú)淚,因?yàn)锳piRequest里特性功能,幾乎都能找到。
參考地址:https://github.com/loopj/android-async-http
Pull To Refresh
下拉刷新,最具移動(dòng)特色的交互方式。如果僅僅局限于Pull To Refresh Listview那就太狹隘了,事實(shí)上Webview、ScrollView、GridView都是可以下拉刷新的,這就是Android Pull-to-refresh庫(kù)給我們帶來(lái)的UI組件,它在github上收獲了2700顆Star。這款插件筆者是直接拿來(lái)就用了,沒(méi)有重蹈覆轍(目測(cè)就算做來(lái)了體驗(yàn)也不好),但還是在這里推薦給大家,因?yàn)榇_實(shí)太好用了。
參考地址:https://github.com/chrisbanes/Android-PullToRefresh
Gifview
Android的ImageView是沒(méi)法顯示Gif圖片的,要顯示動(dòng)圖還是略費(fèi)周折。為了顯示動(dòng)圖,筆者繼承了ImageView,加了setGifFile方法,通過(guò)Movie來(lái)解析Gif圖片,并且不斷地重繪、繪制時(shí)計(jì)算時(shí)間以調(diào)整幀數(shù)從而實(shí)現(xiàn)動(dòng)圖的功能,這倒沒(méi)什么難的,大伙兒貌似都這么干的。但是,后來(lái)在測(cè)試的時(shí)候發(fā)現(xiàn)很多在很多機(jī)器上Movie解析Gif都失敗了,原因不詳也沒(méi)有深究,就在網(wǎng)上找到了Gifview,效果很棒,雖然有些耗內(nèi)存造成gc時(shí)卡頓,但能顯示動(dòng)圖已經(jīng)滿足了。值得一提的是,Gifview的作者是中國(guó)的。
參考地址:https://code.google.com/p/gifview
AndroidTouchGallery
Pinch to zoom、flip to navigate,如果你的項(xiàng)目包含Gallery、這些特性是必不可少的,這方面的庫(kù)倒是不少,筆者用的AndroidTouchGallery感覺(jué)就很實(shí)用、體驗(yàn)也不錯(cuò),不過(guò)通用性倒不是太好,可能要做一些修改才能與你的項(xiàng)目融合,比如將Gifview、ImageLoader以及HttpClient相關(guān)的都整合進(jìn)去,也需要費(fèi)些心思的。
參考地址:https://github.com/Dreddik/AndroidTouchGallery
Android Support v4
這個(gè)Google官方的庫(kù)真是活力十足,ViewPager、Fragment等新特性也能在ICS以下SDK使用了,省了很多力氣。