Android6.0 (API 23)以后 SDK不再支持 org.apache.http.*包的解析

转载于:http://www.cnblogs.com/DarrenChan/p/5469100.html

最近将项目的SDK版本从Android 4.4W.2 (API 20)更改为 Android6.0 (API 23)以后出现了诸多org.apache.http.*包不能解析的问题
截图1

经过一番查找,弄清楚了出现这个问题的原因。其实从Android5.1.1开始Android已经不建议使用自带的org.apache.http.*了,到了6.0版本之后,则直接移除它了,不再支持org.apache.http.*包的解析了。

这是Android5.1.1对使用org.apache.http.*的警告
截图2

下面是转述博客园的一篇文章的解释

一、出现的情况
在eclipse 或 android studio开发,设置android SDK的编译版本为23时,且使用了httpClient相关类的库项目:如android-async-http等等,会出现有一些类找不到的错误。

二、原因
android 6.0 (api 23) SDK,不再提供org.apache.http.*(只保留几个类).

三、解决方法
1.eclipse
libs中加入org.apache.http.legacy.jar
上面的jar包在:**\android-sdk-windows\platforms\android-23\optional下(需要下载android 6.0的SDK)

2.android studio
在相应的module下的build.gradle中加入

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都未曾修复。像这种明明可以不包含,却非要包含,然后又不与人家同步的情况真是不该。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在您提到的问题中,出现了org.apache.http.client.methods.HttpGet类无法将其转换为org.apache.http.HttpEntityEnclosingRequest类的情况。根据引用和引用的内容,这个问题可能是由于在Android 6.0及更高版本中,Google移除了与Apache HttpClient相关的类。这意味着一些早期版本中使用的类可能已经过时或不再可用。 为了解决这个问题,您可以尝试以下方法: 1. 迁移到使用最新的HttpClient库:考虑将您的项目迁移到使用最新的HttpClient库,如Apache HttpClient 4.5.x或更高版本。这些版本中已经更新了类库,并提供了新的解决方案,以适应Android的变化。 2. 使用HttpURLConnection:如果您不想迁移到新的HttpClient库,您可以考虑使用Java标准库中的HttpURLConnection类来进行网络请求。HttpURLConnection是Android平台的一部分,并且提供了与服务器进行HTTP通信的功能。 3. 导入org.apache.http.legacy.jar:根据引用的内容,您可以尝试在您的项目的buildpath中导入org.apache.http.legacy.jar。这个jar含了在Android 6.0中被移除的Apache HttpClient的相关类,可能可以解决您遇到的问题。 请注意,这些方法可能需要根据您的具体项目和需求进行适当的调整和实施。建议您仔细阅读相关文档并进行必要的测试,以确保您选择的解决方案适用于您的情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值