Android M 开发者预览版中的 Volley:org.apache.http 无法解析

Volley in Android M developer preview: org.apache.http cannot be resolved

我正在 Android M Developer Preview 中测试 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

官方“行为变更”文档states that the Apache HTTP client is removed in Android M — not deprecated, but removed. Personally I highly suggest switching to OkHttp,自 KitKat 以来实际上用作 HttpURLConnection 引擎,通过使用依赖项,您可以直接从 Square 团队获得所有新鲜的东西。

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

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

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

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

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

然后一个简单的修复就是使用 HttpURLConnection class:

中常量的版本
if (error.networkResponse.statusCode == HttpURLConnection.HTTP_UNAUTHORIZED) {}