如何处理 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响应?

ssh框架 hibernate 多表查询出的vo对象如何处理

mybatis中如果存在参数不再实体中的是如何处理

如何处理 REST api 中的关系

如何处理异步/等待获取 API 中的错误 404

我应该如何处理 RESTful API 中的对象层次结构?