一、出現的情況
設置android SDK的編譯版本為23時,且使用了httpClient相關類的庫項目:如android-async-http等等,會出現有一些類找不到的錯誤。
二、原因
android 6.0(api 23) SDK,不再提供org.apache.http.*(只保留幾個類).
三、解決方法
1.eclipse:
上面的jar包在:**\android-sdk-windows\platforms\android-23\optional下(需要下載android 6.0的SDK)
android {
useLibrary 'org.apache.http.legacy'
}
注意放置的位置:是在android {}中
可以參考:
https://developer.Android.com/preview/behavior-changes.html
四.谷歌和阿帕奇的愛恨情仇
初,谷歌安卓新出,庫中自帶HttpClient 4.0測試預覽版。為與安卓保持API同步,HTTPClient不敢大動大改。后來,HTTPClient 4.0漸趨成熟,apache欲使android跟進更新對應的庫,android拒絕之。然舊庫bug叢生,瑕疵遍地。故今apache新出一個HTTPClient for android。
你說,既然android自帶的不好(有些舊),為啥不直接導入apache的呢?因為包名是一樣的,庫沖突。不是不能解決,也能,麻煩。從apache下載最新的httpclient源碼,把每個源文件包名改了,改成跟android不沖突的。然后打包成jar文件,然后導入到android工程的lib里。
五.回歸平靜
現在,android 6.0已經移除了httpClient,於是世界又恢復了平靜。我們可以從apache下載httpClient,然后導入到lib中,不用改名了。
直接使用httpclient很好,apache的httpclient也有相對應的異步請求組件HttpAsyncClient。因為android不允許在UI線程中進行網絡請求,所以我們只得通過回調函數(鈎子函數)來進行請求結果處理。除了使用apache的httpclient,更好的方式是使用loopj.android.AsyncHttpClient
六. AsyncHttpClient到底基於誰
loopj.android.AsyncHttpClient是James Smith基於httpClient封裝的用於android的網絡請求包,一開始,它當然是對android自帶的httpClient進行封裝(也就是apache的);然后apache的httpClient發生了很大改變,loopj要跟誰走?是跟着google繼續保守,還是跟上apache更新的步伐?它選擇了跟apache走,可是不能直接使用apache的httpClient呀!因為android中自帶httpClient,包名沖突啊!所以就改成了cz.msebera.android.httpclient。經常用到的是:
import cz.msebera.android.httpclient.Header
loopj官網上的要比github上更新慢!今天更新了一下loopj.android.httpClient,發現cz.msebera.android用不了了,於是換成apache 的httpClient,能用了。
於是,一切終歸平靜。
簡而言之,谷歌的android不在自帶apache的httpClient,而是把選擇權交給程序員。loopj.android.AsyncHttpClient不在無所適從,可以放心的基於apache的httpClient而不用在改包名了。
所以,作為一個獨立的組織,不要輕易包含別的組織的東西。因為你一旦包含了,那就沒法做到跟人家同步更新!人家是專門干這個活的,你們兩個更新步伐不一致,那會很坑的呀。如果必須要使用到別的組織的東西,那就屬於依賴,那是另外一回事了。比如ubuntu中sudo apt install eclipse,那eclipse版本不是最新版的,很多bug都未曾修復。像這種明明可以不包含,卻非要包含然后又不與人家同步的情況真是不該。