Android 9.0/P 版本推薦使用HttpURLConnection

早在幾年前,谷歌就推薦在Android2.3版本以上使用HttpURLConnection,而在正式發佈的 Android P 版本中,谷歌徹底取消了對Apache HTTPClient的支持,針對此更改,開發者該如何正確適配 Android P 。

Android 6.0 版本移除了對Apache HTTP客戶端的支持。如果你的應用使用該客戶端,並以 Android 2.3(API 級別爲9)或更高版本爲目標平臺,請改用 HttpURLConnection 類。此API效率更高,能夠通過透明壓縮和響應緩存減少網絡使用,並可最大限度降低耗電量。要繼續使用 Apache HTTP API,須先在 build.gradle 文件中聲明以下編譯時依賴項。

android {
    useLibrary 'org.apache.http.legacy'
}

 

Remove org.apache.http.legacy from bootclasspath

從Android P開始,org.apache.http.legacy 庫將從 bootclasspath 中刪除。

 

(1). 修改對 TargetSdkVersion<P 的應用的影響

該修改對大多數 TargetSdkVersion<P 的應用都無影響,但是如果應用使用了系統 ClassLoader加載org.apache.http.*中的類時,將在Android P上發生 NoClassDefFoundError 失敗,因爲系統ClassLoader不再知道這些類。爲了防止將來出現類似的問題,應用應該通過應用 ClassLoader 加載類,而不是直接訪問系統ClassLoader。

方案一:不要使用非標準的 ClassLoader 。

方案二:應用可以自己添加依賴的 apache jar 包到工程 libs 目錄規避該兼容性問題。

注意:對於最低 SDK爲23或更低的應用程序,android:required="false"屬性是必需的,因爲在 API 等級低於24的設備上,org.apache.http.legacy 庫不可用。(在這些設備上,Apache HTTP 類在 bootclasspath 上可用。)

 

(2). 修改對 TargetSdkVersion>=P 的應用的影響

對所有 TargetSdkVersion>=P 的應用,如果還是按照通過在 build.gradle 文件中聲明依賴項。

想繼續使用 Apache-http 接口,都會出現 Apache-http 接口找不到的異常。

需要在應用的 AndroidManifest.xml 文件中添加:

<uses-libraryandroid:name="org.apache.http.legacy"android:required="false"/>

 

最後,還是推薦使用 HttpURLConnection 替代 Apache-http。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章