讓Android開發者事半功倍的除了AMap和Umeng等免費的開發者服務外還有GitHub上恒河沙數的開源架構,而Android Studio的Gradle機制使得引用Mevan資源更加便捷。然而因為大多數開源架構缺少中文文檔,開發者一不留神就會踩到好多坑:
1、Universal-Image-Loader:莫名其妙的NullPointerException
Universal-Image-Loader(以下簡稱UID)是最早的Android開源架構之一,用來進行異步圖像加載,緩存和顯示。
很多新手初用UID,都會被提示NullPointerException,那是因為UID沒有預設參數,你需要在Application的OnCreate()裡面配置ImageLoaderConfiguration
2、Glide:和CircleImageView不相容
Glide是 Google 員工的開源項目,在2014年的Google I/O大會上被推薦使用,作為一個高效、開源、Android裝置上的媒體管理架構,具有擷取、解碼和展示視訊劇照、圖檔、動畫等功能,比UID不知強到哪裡去了。
但是項目疊代時把Picasso換成Glide的時候每個頁面裡的第一個CircleImageView第一次加載圖檔總是顯示PlaceHolder。Glide加載圓形圖檔的方法很多,而CircleImageView不是其中之一。
3、Fresco:wrap_content居然等于0dp
Fresco是Facebook最新推出的一款用于Android應用中展示圖檔的強大圖檔庫,可以從網絡、本地存儲和本地資源中加載圖檔。Fresco于2015年開源,開源之初大火了一把,很多跟風開發者都紛紛使用Fresco,仿佛不用Fresco就low人一等似得。
第一次用Fresco加載圖檔時照例設定寬高為wrap_content,沒想到居然不顯示圖檔,連SimpleDraweeView都不顯示。實際情況是SimpleDraweeView已經被成功加載了,隻不過高度為0dp而已,是以你自然就看不到了。
SimpleDraweeView的寬高至少其中之一的測量規格(MeasureSpec)模式為MeasureSpec.EXACTLY,換句話說,寬高至少其中之一必須被指定為match_parent或者固定寬高值(例如:100dp)。當寬高其中之一被指定為warp_content時,必須在代碼中為控件設定寬高比(draweeView.setAspectRatio(0.5F);)。寬高不能都被設定為warp_content。
4、FastJson:這個bug已經改正了
FastJson是一個阿裡巴巴推出的Json處理工具包,除了在處理資料量不大的Json時速度遠大于Jackson和Gson之外,還有詳細的中文文檔。
然而FastJson的早期版本解析“不是Json的Json”(格式不正确的Json)時不會throw error——直接Crash。
5、AsyncHttpClient:不能在Thread裡使用
AsyncHttpClient是自帶異步加載的HTTP庫,自帶Async,在HttpClient時代一度流行過。
然而在Thread中使用AsyncHttpClient會抛出這樣的異常:“java.lang.IllegalArgumentException: Synchronous ResponseHandler used in AsyncHttpClient. You should create your response handler in a looper thread or use SyncHttpClient instead.”
這是因為在AsyncHttpClient僅能用于UIThread,在Thread裡應該用SyncHttpClient進行同步加載。
6、OKHttp:不能什麼都怪架構
OKHttp是Google官方推薦的HTTP庫,在Android 6.0版本删除了對HttpClient的支援後大放光芒。
前幾天我用OKHttp上傳圖檔的時候發現傳回的不是Json,而是一個寫着“The request sent by the client was syntactically incorrect”的400網頁,我的Java同僚堅信他的接口沒問題,還說别的Android項目沒問題,讓我把代碼copy過去用就行了,我找來他說的“沒問題”的代碼一看,居然是用HttoClient進行請求的,再一看這代碼是2012年寫的,這是讓我把産品相容到4.0以前嗎?這個問題困擾了我幾個小時,終于我在“沒問題”的代碼的一大堆“StringBuffer”中看出問題所在:原來正确的key是“file”而他給我的Api文檔寫的是“image”,看來不能出了什麼問題都怪架構呀。