如何在Android Marshmallow上使用传统的Apache HTTP客户端?

背景

在Android Marshmallow上,Google已经完全删除了对Apache HTTP客户端的支持(链接在这里),因为它与替代方案相比没有良好的性能。

这也可能是导致许多应用程序在Android Marshmallow上崩溃的原因。

问题

Google 允许您仍然使用此 API,只是不将其作为内置 API,方法是将以下行添加到 gradle 文件中:

useLibrary 'org.apache.http.legacy'

所以,这就是我所做的:

dependencies {
    classpath 'com.android.tools.build:gradle:1.3.0'
}

和:

android {
    compileSdkVersion 'android-MNC'
    buildToolsVersion "23.0.0 rc3"
    useLibrary 'org.apache.http.legacy'

    defaultConfig {
        applicationId "com.example.user.androidmtest"
        minSdkVersion 'MNC'
        targetSdkVersion 'MNC'
        versionCode 1
        versionName "1.0"
    }

当我尝试它时,它编译得很好(没有显示错误,我可以运行概念验证应用程序,因为它没有任何特殊代码),但是当我尝试使用一些我知道是旧API一部分的类(如“HttpClient”类)时,我发现它不允许我这样做。

我知道不建议使用此解决方案,但是我们必须让应用程序至少暂时准备好在那里工作,直到我们100%处理Android Marshmallow应该改变的所有事情,并且我们不希望以崩溃的形式出现意外。

下面是一个屏幕截图:

enter image description here

问题

为什么会发生这种情况?我是否正确使用它?


编辑:在这里报告了这个问题:

https://code.google.com/p/android/issues/detail?id=181474


答案 1

Android Studio抱怨说,像这样的课程org.apache.http

org.apache.http.NameValuePair
org.apache.http.client.utils.URLEncodedUtils

失踪了。

所以我添加了哪个在文件夹中到org.apache.http.legacy.jarAndroid/Sdk/platforms/android-23/optionalapp/libs

我还将此行添加到我的文件中app.gradle

compile files('libs/org.apache.http.legacy.jar')

但是,如果您使用的是更多库,则可以通过这种方式使用。

compile fileTree(dir: 'libs', include: ['*.jar'])

这解决了我所有的错误,这些错误是由谷歌删除了对Apache HTTP客户端的支持而引起的。


答案 2

useLibrary 'org.apache.http.legacy' 在我升级了 Android Studio 项目的主要 build.gradle 文件中的 Gradle 工具版本之前,我一直不起作用,如下所示:

dependencies {
    classpath 'com.android.tools.build:gradle:1.3.0'
}

推荐