如何处理 Android API 23 中的 volley(删除相关的 apache http 包)?
Posted
技术标签:
【中文标题】如何处理 Android API 23 中的 volley(删除相关的 apache http 包)?【英文标题】:How to deal with volley in Android API 23(which remove related apache http package)? 【发布时间】:2015-09-02 05:53:15 【问题描述】:在我更新我的 sdk 并在我的项目中使用 API 23 后,我发现有一些错误导致无法找到一些相关的包。然后我 goole 并知道 api 23 已经删除了 apache http 包。 那么现在什么是旧 apache http 包的替代品,换句话说,如何在 android API 23 中处理 volley 以避免错误。 我已经去凌空的google source 搜索新版本,但似乎没有解决方案。
【问题讨论】:
【参考方案1】:这是我为凌空https://gist.github.com/HussainDerry/0b31063b0c9dcb1cbaec 写的一个多部分请求。 它使用 OkHttp,因此您不必再担心 Apache 问题。
import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.RetryPolicy;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.HttpHeaderParser;
import com.squareup.okhttp.Headers;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.RequestBody;
import android.util.Log;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import okio.Buffer;
/**
* Multipart request for Google's Volley using Square's OkHttp.
* @author Hussain Al-Derry
* @version 1.0
* */
public class VolleyMultipartRequest extends Request<String>
/* Used for debugging */
private static final String TAG = VolleyMultipartRequest.class.getSimpleName();
/* MediaTypes */
public static final MediaType MEDIA_TYPE_JPEG = MediaType.parse("image/jpeg");
public static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
public static final MediaType MEDIA_TYPE_TEXT_PLAIN = MediaType.parse("text/plain");
private MultipartBuilder mBuilder = new MultipartBuilder();
private final Response.Listener<String> mListener;
private RequestBody mRequestBody;
public VolleyMultipartRequest(String url,
Response.ErrorListener errorListener,
Response.Listener<String> listener)
super(Method.POST, url, errorListener);
mListener = listener;
mBuilder.type(MultipartBuilder.FORM);
/**
* Adds a collection of string values to the request.
* @param mParams @link HashMap collection of values to be added to the request.
* */
public void addStringParams(HashMap<String, String> mParams)
for (Map.Entry<String, String> entry : mParams.entrySet())
mBuilder.addPart(
Headers.of("Content-Disposition", "form-data; name=\"" + entry.getKey() + "\""),
RequestBody.create(MEDIA_TYPE_TEXT_PLAIN, entry.getValue()));
/**
* Adds a single value to the request.
* @param key String - the field name.
* @param value String - the field's value.
* */
public void addStringParam(String key, String value)
mBuilder.addPart(
Headers.of("Content-Disposition", "form-data; name=\"" + key + "\""),
RequestBody.create(MEDIA_TYPE_TEXT_PLAIN, value));
/**
* Adds a binary attachment to the request.
* @param content_type @link MediaType - the type of the attachment.
* @param key String - the attachment field name.
* @param value @link File - the file to be attached.
* */
public void addAttachment(MediaType content_type, String key, File value)
mBuilder.addPart(
Headers.of("Content-Disposition", "form-data; name=\"" + key + "\""),
RequestBody.create(content_type, value));
/**
* Builds the request.
* Must be called before adding the request to the Volley request queue.
* */
public void buildRequest()
mRequestBody = mBuilder.build();
@Override
public String getBodyContentType()
return mRequestBody.contentType().toString();
@Override
public byte[] getBody() throws AuthFailureError
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try
Buffer buffer = new Buffer();
mRequestBody.writeTo(buffer);
buffer.copyTo(bos);
catch (IOException e)
Log.e(TAG, e.toString());
VolleyLog.e("IOException writing to ByteArrayOutputStream");
return bos.toByteArray();
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response)
String parsed;
try
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
catch (UnsupportedEncodingException e)
parsed = new String(response.data);
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
@Override
public Request<?> setRetryPolicy(RetryPolicy retryPolicy)
return super.setRetryPolicy(retryPolicy);
@Override
protected void deliverResponse(String response)
if (mListener != null)
mListener.onResponse(response);
希望对你有用。
【讨论】:
【参考方案2】:您可以通过 Gradle 手动添加缺少的库和包。
例如,可以通过在 Gradle 脚本中的依赖项下添加以下行来添加 Apache HTTP 客户端:
compile 'org.apache.httpcomponents:httpclient:4.5'
要查找您需要的其他软件包,我推荐网站http://mvnrepository.com/。
【讨论】:
警告:依赖 org.apache.httpcomponents:httpclient:4.5 在调试时被忽略,因为它可能与 Android 提供的内部版本冲突。【参考方案3】:你可以放弃,同时使用旧的 apache 库编译你的应用程序。
在您的build.gradle
中,对于任何依赖于 volley 的内容,将其插入到 android 部分。
android
useLibrary 'org.apache.http.legacy'
More info on Developer Site
Other Examples
【讨论】:
对不起,我已经在我的 gradle 中尝试过这个,但它不起作用。我想可能是因为我不理解这个'useLibray'。 您是否使用最新的 gradle 插件 (1.3.0) 和构建工具 (23.0.0)? 是的,可以编译运行项目,但是红色的错误还在文件中。 你能提交你的 build.gradle 吗? 这个链接paste.ubuntu.com/12251368是gradle。错误就像找不到org.apache.http.HttpResponse以上是关于如何处理 Android API 23 中的 volley(删除相关的 apache http 包)?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理android中reddit api的深层嵌套json响应?