Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 438|回复: 0

android 6.0 SDK中删除HttpClient的相关类的解决方法

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-24 11:04:48 | 显示全部楼层 |阅读模式

    一、出现的情况

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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-12 01:41 , Processed in 0.065843 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表