微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 如何使用Stetho与Volley?

为我的请求创建了一个凌空单例类.这是我的单例类
public class VolleySingleton {

    private static VolleySingleton instance;
    private RequestQueue reQueue;

    private VolleySingleton(Context context) {
        reQueue = Volley.newRequestQueue(context,new OkHttpStack(new OkHttpClient()));
    }

    public static VolleySingleton getInstance(Context context) {
        if(instance == null)
            instance = new VolleySingleton(context);
        return instance;
    }

    public RequestQueue getRequestQueue() {
        return reQueue;
    }

    public <T> void addToRequestQueue(Request<T> request) {
        request.setTag("app");
        request.setShouldCache(false);
        request.setRetryPolicy(new DefaultRetryPolicy(10000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        getRequestQueue().add(request);
    }
}

并且使用OKHTTP堆栈和我的Volley实现.这是我的OKHttp.class

public class OkHttpStack implements HttpStack {

    private final OkHttpClient mClient;

    public OkHttpStack(OkHttpClient client) {
        this.mClient = client;
    }

    @Override
    public HttpResponse performRequest(Request<?> request,Map<String,String> additionalHeaders)
            throws IOException,AuthFailureError {

        OkHttpClient client = mClient.clone();
        int timeoutMs = request.getTimeoutMs();
        client.setConnectTimeout(timeoutMs,TimeUnit.MILLISECONDS);
        client.setReadTimeout(timeoutMs,TimeUnit.MILLISECONDS);
        client.setWriteTimeout(timeoutMs,TimeUnit.MILLISECONDS);

        com.squareup.okhttp.Request.Builder okHttpRequestBuilder = new com.squareup.okhttp.Request.Builder();
        okHttpRequestBuilder.url(request.getUrl());

        Map<String,String> headers = request.getHeaders();
        for (final String name : headers.keySet()) {
            okHttpRequestBuilder.addHeader(name,headers.get(name));
        }
        for (final String name : additionalHeaders.keySet()) {
            okHttpRequestBuilder.addHeader(name,additionalHeaders.get(name));
        }

        setConnectionParametersForRequest(okHttpRequestBuilder,request);

        com.squareup.okhttp.Request okHttpRequest = okHttpRequestBuilder.build();
        Call okHttpCall = client.newCall(okHttpRequest);
        Response okHttpResponse = okHttpCall.execute();

        StatusLine responseStatus = new BasicStatusLine(parseProtocol(okHttpResponse.protocol()),okHttpResponse.code(),okHttpResponse.message());
        BasicHttpResponse response = new BasicHttpResponse(responseStatus);
        response.setEntity(entityFromOkHttpResponse(okHttpResponse));

        Headers responseHeaders = okHttpResponse.headers();
        for (int i = 0,len = responseHeaders.size(); i < len; i++) {
            final String name = responseHeaders.name(i),value = responseHeaders.value(i);
            if (name != null) {
                response.addheader(new BasicHeader(name,value));
            }
        }

        return response;
    }

    private static httpentity entityFromOkHttpResponse(Response r) throws IOException {
        Basichttpentity entity = new Basichttpentity();
        ResponseBody body = r.body();

        entity.setContent(body.byteStream());
        entity.setContentLength(body.contentLength());
        entity.setContentEncoding(r.header("content-encoding"));

        if (body.contentType() != null) {
            entity.setContentType(body.contentType().type());
        }
        return entity;
    }

    @SuppressWarnings("deprecation")
    private static void setConnectionParametersForRequest(com.squareup.okhttp.Request.Builder builder,Request<?> request)
            throws IOException,AuthFailureError {
        switch (request.getmethod()) {
            case Request.Method.DEPRECATED_GET_OR_POST:
                // Ensure backwards compatibility.  Volley assumes a request with a null body is a GET.
                byte[] postBody = request.getPostBody();
                if (postBody != null) {
                    builder.post(RequestBody.create(MediaType.parse(request.getPostBodyContentType()),postBody));
                }
                break;
            case Request.Method.GET:
                builder.get();
                break;
            case Request.Method.DELETE:
                builder.delete();
                break;
            case Request.Method.POST:
                builder.post(createRequestBody(request));
                break;
            case Request.Method.PUT:
                builder.put(createRequestBody(request));
                break;
            case Request.Method.HEAD:
                builder.head();
                break;
            case Request.Method.OPTIONS:
                builder.method("OPTIONS",null);
                break;
            case Request.Method.TRACE:
                builder.method("TRACE",null);
                break;
            case Request.Method.PATCH:
                builder.patch(createRequestBody(request));
                break;
            default:
                throw new IllegalStateException("UnkNown method type.");
        }
    }

    private static ProtocolVersion parseProtocol(final Protocol p) {
        switch (p) {
            case HTTP_1_0:
                return new ProtocolVersion("HTTP",1,0);
            case HTTP_1_1:
                return new ProtocolVersion("HTTP",1);
            case SPDY_3:
                return new ProtocolVersion("SPDY",3,1);
            case HTTP_2:
                return new ProtocolVersion("HTTP",2,0);
        }

        throw new IllegalAccessError("Unkwown protocol");
    }

    private static RequestBody createRequestBody(Request r) throws AuthFailureError {
        final byte[] body = r.getBody();
        if (body == null) return null;

        return RequestBody.create(MediaType.parse(r.getBodyContentType()),body);
    }
}

我还在我的application.class中使用了Stetho

Stetho.initialize(
                Stetho.newInitializerBuilder(this)
                        .enableDumpapp(
                                Stetho.defaultDumperPluginsprovider(this))
                        .enableWebKitInspector(
                                Stetho.defaultInspectorModulesProvider(this))
                        .build());

问题是当我调试我无法在我的浏览器中获取我的应用程序发出的网络调用.不确定我哪里出错!帮助!

解决方法

在项目 Updated OkHttpStack添加文件

试试这个:

Stetho.initializeWithDefaults(this);
OkHttpClient client = new OkHttpClient();
client.networkInterceptors().add(new StethoInterceptor());
mRequestQueue = Volley.newRequestQueue(getApplicationContext(),new OkHttpStack(client));

具有以下依赖项:

compile 'com.facebook.stetho:stetho:1.1.1'
compile 'com.facebook.stetho:stetho-okhttp:1.1.1'
compile 'com.squareup.okhttp:okhttp:2.3.0'

原文地址:https://www.jb51.cc/android/310787.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐