【问题标题】:Apache HTTP Client Removal from API23, will that have an effect on Volley?从 API23 移除 Apache HTTP 客户端,这会对 Volley 产生影响吗?
【发布时间】:2015-12-04 23:49:09
【问题描述】:

正如我们所知,Apache HTTP ClientAPI 23

中被删除

Apache HTTP Client Removal

但是Volley库目前仍然使用Apache的库如

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.StatusLine;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.impl.cookie.DateUtils;

我已经测试了 2 个项目:一个是 compileSdkVersion 22,另一个是 compileSdkVersion 23,得到了 2 个屏幕截图:

compileSdkVersion 22

compileSdkVersion 23

我有两个问题:

  1. 当然,使用 Volley 的 API23 项目仍然可以成功运行。 但是,我不明白他们如何在运行时使用Apache 的库,是吗? 在 API22 或更低版本中查找?
  2. 另外,不知道在不久的将来,Volley会不会升级成这样 不再使用Apache 的库?如果没有,当Apache 的库被完全删除且不受支持时,我当前的项目将来是否仍然有效?

也许我的英语不是很清楚,但是,希望你能理解我的问题。

任何解释将不胜感激。

更新:

从@random 的cmets,我使用Google 的官方Volley 库(我的意思是git clone https://android.googlesource.com/platform/frameworks/volley,正如Google 建议的here)创建了一个新的API23 项目,而不是在build.gradle 文件中使用compile 'com.mcxiaoke.volley:library:1.0.17'。是的,在构建项目时出现了缺少 Apache 库的错误。必须按照文档将useLibrary 'org.apache.http.legacy' 添加到build.gradle 文件中。


第二次更新:

我刚刚自定义了 Google 的 volley(作为我项目中的一个模块)删除 Apache 库。请转至my GitHub sample project 供您参考。但是,请注意,它并未针对所有案例进行全面测试,我仅测试了 02 个简单案例:GETPOST 使用我的 Web 服务 ASP.NET Web API 的请求。

【问题讨论】:

  • IMO 更紧迫的问题是 Volley,它是一个 Google 库,是使用不推荐使用的代码实现的,从 v23 开始,它实际上已从源代码中排除。使用useLibrary 'org.apach.http.legacy' 标志是在有意删除遗留代码时保留遗留代码的一种解决方法。我希望 Volley 要么彻底检查整个代码以删除 apache 组件,要么声明该库不会进一步开发。目前情况还很模糊。
  • @ItaiHanski:我刚刚自定义了 Google 的 volley(作为我项目中的一个模块)删除 Apache 库。请到我的 GitHub 链接github.com/ngocchung/VolleyNoApache。请注意,它尚未针对所有情况进行全面测试:)
  • 凌空替换的另一个高度扩展的选项是github.com/apptik/jus

标签: android apache httpresponse android-volley android-api-levels


【解决方案1】:

Android M 中的 Volley 库似乎相当混乱。已经为它提交了一个错误并被谷歌承认。

https://code.google.com/p/android-developer-preview/issues/detail?id=3013

您应该为它加注星标并跟踪它以获取任何进一步的更新

更新

关于您的第一个问题,您不会因为缺少 apache 文件而收到错误消息,因为您使用的库仍然是使用 API 22 编译的

ANDROID_BUILD_TARGET_SDK_VERSION=22
ANDROID_BUILD_TOOLS_VERSION=22.0.1
ANDROID_BUILD_SDK_VERSION=22

https://github.com/mcxiaoke/android-volley/blob/master/gradle.properties

还可以从图书馆检查这个open issue 您可以根据它添加遗留库

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.0"

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

【讨论】:

  • 感谢您的回答。您能否提供有关我的第一个问题的更多信息?
  • 报告的问题是由于缺少 apache 文件,代码无法编译。不确定您是否包含了外部 apache 库以及您的构建设置。
  • 我不在libs 文件夹中包含 apache。 build.gradle android { compileSdkVersion 23 buildToolsVersion "23.0.0" defaultConfig { applicationId "..." minSdkVersion 16 targetSdkVersion 23 } buildTypes { release { ... } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.0.0' compile 'com.mcxiaoke.volley:library:1.0.17' compile 'com.google.code.gson:gson:2.3' }
  • 它可能会抱怨你先添加 API 22。如果您按照 google 建议的添加方式添加 volley 会很好,您使用的库不是由 google 提供的。它只是偶尔从谷歌来源更新自己,并有自己的构建设置。如果您以推荐的方式添加 volley,则必须添加外部遗留 apache 库,但这样您就会知道所有内容是如何链接在一起的
  • :) volley 现在不稳定,所以你会遇到这样的问题。关于recommended 方式,您可以包含您提到的jar 或将其包含为模块。使用模块方式,您可以查看源代码,自己修复错误,例如添加其他问题中提到的缺少的构造函数。您也可以使用 jar 来执行此操作,但每次都必须重新创建它。如果你决定使用凌空抽球,你将不得不稍微挣扎,直到它变得更加稳定。
【解决方案2】:

Apache HTTP 客户端删除 此预览版删除了对 Apache HTTP 客户端的支持。如果您的应用正在使用此客户端并针对 Android 2.3(API 级别 9)或更高版本,请改用 HttpURLConnection 类。此 API 更高效,因为它通过透明压缩和响应缓存减少了网络使用,并将功耗降至最低。要继续使用 Apache HTTP API,您必须首先在 build.gradle 文件中声明以下编译时依赖项:

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

Android 正在从 OpenSSL 迁移到 BoringSSL 库。如果您在应用程序中使用 Android NDK,请不要链接到不属于 NDK API 的加密库,例如 libcrypto.so 和 libssl.so。这些库不是公共 API,可能会在不同版本和设备之间更改或中断,恕不另行通知。此外,您可能会将自己暴露在安全漏洞中。相反,修改您的本机代码以通过 JNI 调用 Java 加密 API 或静态链接到您选择的加密库。

【讨论】:

  • 谢谢!不过我的项目不直接使用Apache的库,只使用Volley,所以不需要在build.gradle中声明那行
  • 嗨!您的答案将适用于使用 Google 官方 volley(我的意思是 git clone https://android.googlesource.com/platform/frameworks/volley)的 API23 项目。谢谢
【解决方案3】:
android {
    useLibrary 'org.apache.http.legacy'
}

dependencies {
    compile 'commons-httpclient:commons-httpclient:3.1'
}

【讨论】:

    【解决方案4】:

    将此添加到您的应用程序的 de 依赖项中,然后可以正常工作:

    依赖{ ... 编译'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2' }

    【讨论】:

    • 嗨!正如我在问题中提到的,使用 Volley 的 API23 项目仍然可以成功运行
    【解决方案5】:

    这是关于 Apache 的 HTTP 客户端的一大歇斯底里。您可以在任何您想要的项目中继续使用它,而不会产生任何后果。为什么要浪费时间将代码移植到其他库?我在这里描述了继续使用 Apache 库的最佳方式:https://stackoverflow.com/a/37623038/1727132(剧透:不要使用旧版本!)

    【讨论】:

      【解决方案6】:

      Appache Http 已从 android API level 23 中删除,如果您仍在使用 Apache Http 客户端,您可以在您的 project - module build.gradle 中包含 android { useLibrary 'org.apache.http.legacy'}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-03
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 2012-03-11
        • 1970-01-01
        • 2019-06-24
        相关资源
        最近更新 更多