【问题标题】:Volley in Android M developer preview: org.apache.http cannot be resolvedAndroid M开发者预览中的Volley:org.apache.http无法解析
【发布时间】:2015-07-10 21:48:24
【问题描述】:

我正在 Android M 开发者预览版中测试 Volley 的 HurlStack。

在我将compileSdkVersion22 更改为'android-MNC' 后,org.apache.http 中的所有类都不会被编译:

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.ProtocolVersion;
import org.apache.http.StatusLine;
import org.apache.http.entity.BasicHttpEntity;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.message.BasicStatusLine;

如何修改我的代码来解决这个问题?

我知道有一些与 Apache HTTP 客户端相关的更改,但是当我按照步骤在 gradle 中添加 useLibrary 'org.apache.http.legacy' 时它仍然不起作用。

参考:HurlStack.java AOSP

Behavior Changes: Apache HTTP Client Removal

【问题讨论】:

  • Apache HttpClient 已经被弃用了一段时间。 Volley 在旧版本的 Android 上使用 HttpClient,在新版本上使用 URLConnection。很可能他们已经从 M 预览版中删除了 httpclient。当您将 android 的最低版本设置为 Volley 使用 URLConnection 的级别时,该错误不应发生。
  • 或者你可以自己包含httpClient。喜欢这里:code.google.com/p/httpclientandroidlib
  • @Christine 谢谢你的回答。在developer.android.com/preview/setup-sdk.html 部分“更新现有项目”中,Google 建议将 minSdkVersion 设置为“MNC”。我想知道是否有官方方法可以绕过这个。
  • Volley 作为源项目在您的 IDE 中。您可以在那里删除对 httpclient 的调用。代码在 Volley.java 的“newRequestQueue()”中
  • 该应用似乎可以在 Developer Preview 2 上运行。我添加了 useLibrary 'org.apache.http.legacy' 并将 gradle 版本更改为 1.3.0-beta4。 IDE 仍然无法解析该库。希望这会有所帮助。

标签: android android-volley android-mnc


【解决方案1】:

官方“行为更改”文档states 指出,Apache HTTP 客户端已在 Android M 中被移除 — 未弃用,但已移除。就我个人而言,我强烈建议切换到 OkHttp,它实际上用作自 KitKat 以来的 HttpURLConnection 引擎,通过使用依赖项,您可以直接从 Square 团队获得所有新鲜的东西。

【讨论】:

    【解决方案2】:

    您可以忽略这些警告,因为 Volley 仍然使用 API 22 编译: https://github.com/mcxiaoke/android-volley/blob/master/gradle.properties

    在 proguard 配置中添加这些: -不要警告 org.apache.http.** -dontwarn com.android.volley.toolbox.**

    【讨论】:

      【解决方案3】:

      除了使用 okHttp 之外,后备方案是使用 Google 建议的旧版 apache httpclient。 请在此处查看我的答案以使其正常工作。

      How to use the legacy Apache HTTP client on Android Marshmallow?

      【讨论】:

        【解决方案4】:

        如果像我一样,您包含 HttpClient 的唯一原因是因为您正在测试 HTTP 响应代码:

        if (error.networkResponse.statusCode == HttpStatus.SC_UNAUTHORIZED) {}
        

        那么一个简单的解决方法就是使用 HttpURLConnection 类中的常量版本:

        if (error.networkResponse.statusCode == HttpURLConnection.HTTP_UNAUTHORIZED) {}
        

        【讨论】:

        • 但请注意,并非所有 Http 状态代码都存在于 HttpURLConnection 类中。例如,临时重定向的 307 不再存在。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-21
        • 1970-01-01
        • 2014-08-18
        • 1970-01-01
        相关资源
        最近更新 更多