Android弃用apache模块(HttpClient,HttpResponse等)
Android已经弃用了API级别22以来的Apache模块,所以我的问题是,我该如何使用,例如Apache库中的HttpResponse
,而不是Android SDK? 问题是这两个软件包都是一样的。
但是,例如, HttpGet
是可以的,因为它在Apache中被称为HttpGetHC4
。
HttpClient方法已被弃用。 您可以使用URLConnection,如下所示:
private StringBuffer request(String urlString) { // TODO Auto-generated method stub StringBuffer chaine = new StringBuffer(""); try{ URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setRequestProperty("User-Agent", ""); connection.setRequestMethod("POST"); connection.setDoInput(true); connection.connect(); InputStream inputStream = connection.getInputStream(); BufferedReader rd = new BufferedReader(new InputStreamReader(inputStream)); String line = ""; while ((line = rd.readLine()) != null) { chaine.append(line); } } catch (IOException e) { // Writing exception to log e.printStackTrace(); } return chaine; }
我希望这是帮助别人。
使用Apache的模块没什么不好的。 谷歌只是把它弄得一团糟,因为它们没有成功。 Google和Apache的整合是由Jesse Wilson监督的 – 他在Google工作,搞砸了一切,然后在广场上工作的时候创build了自己的图书馆(OkHttp)。 这是一个非常丑陋的故事。
我反对使用传统的JAR文件,因为它包含了一个旧版本的Apache库,没有改进和错误修正(这是一个非常古老的BETA前快照 )。 正如您在Apache组件的官方页面上看到的那样,有一个全新的4.4版本,与所有的Android版本兼容。 它只是不得不被重新包装在不同的命名空间下,以避免与旧版本的冲突。
你可以简单地添加从Maven的依赖(或从GitHub下载发布 ):
dependencies { compile "cz.msebera.android:httpclient:4.4.1.2" }
然后用cz.msebera.android.httpclient
replaceorg.apache.http
,这样你的导入将如下所示:
import cz.msebera.android.httpclient.Header; import cz.msebera.android.httpclient.HttpHost; import cz.msebera.android.httpclient.HttpResponse;
是的,你可以继续使用Apache库,而不浪费几个小时重写工作代码!
至于使用Apache组件和HttpURLConnection之间的区别,HttpURLConnection使用响应caching…就这些。 我不确定你是否真的想要,也可以自己实现。
顺便说一句,我尝试了像HttpURLConnection这样的替代品 – 这些甚至不接近Apache的威力和简单性。
在Android棉花糖(sdk 23)中,您可以添加:
useLibrary 'org.apache.http.legacy'
在android {}
部分中构build.gradle作为解决方法。 这似乎是一些谷歌自己的gms库所必需的!
如果我是你,我不使用HttpClient
因为:
Apache HTTP客户端在Eclair和Froyo上有更less的错误。 这是这些版本的最佳select。
对于姜饼和更好,HttpURLConnection是最好的select。
参考
使用OKHttp或HttpUrlConnection 。 而且我也build议不要使用Apache库,因为它可能对Android没有效率。
我想你可以直接在你的项目中使用Apache库,而不是Android中的那些(你可以通过这种方式获得更多的控制权 – 如果需要的话,可以使用旧的SDK版本编译)。
在你的build.gradle中 ,添加这一行:
dependencies { compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1' }
为了防止警告,请添加以下这些行:
android { -- YOUR EXISTING LINES -- packagingOptions { exclude 'META-INF/DEPENDENCIES.txt' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/notice.txt' exclude 'META-INF/license.txt' exclude 'META-INF/dependencies.txt' exclude 'META-INF/LGPL2.1' } }
将此添加到您的应用程序的依赖关系,然后它将正常工作:
dependencies { ... compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2' }
如果还想使用httpclient库,则应该在build.gradle文件中添加一些描述。 而且似乎添加到build.gradle文件的内容是由目标Android项目构build的。
如果针对API22及更高版本,则应将以下行添加到build.gradle中
dependencies { compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1' }
如果针对API23及更高版本,则应将以下行添加到build.gradle中
dependencies { compile group: 'cz.msebera.android' , name: 'httpclient', version: '4.4.1.1' }
这里是参考链接
使用openConnection()。
HttpClient文档build议。
参考这个答案。