【问题标题】:How to use Stetho with Volley?如何将 Stetho 与 Volley 一起使用?
【发布时间】:2015-08-14 14:11:25
【问题描述】:

为我的请求创建了一个 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);
    }
}

我在 Volley 实现中使用 OKHTTP 堆栈。这是我的 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, 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());

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

【问题讨论】:

    标签: android facebook okhttp stetho


    【解决方案1】:

    将此文件添加到项目Updated OkHttpStack

    试试这个:

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

    具有以下依赖项:

    implementation 'com.facebook.stetho:stetho-okhttp:(insert latest version)'
    implementation 'com.squareup.okhttp3:okhttp:(insert latest version)'
    

    【讨论】:

    • 您好,我很好奇您如何使用 OkHTTPStack 处理 SSL?我目前在 Volley 中使用带有 SSL 的 HurlStack,并想切换到 OkHTTP,这样我就可以使用 Stetho 进行网络跟踪。
    【解决方案2】:

    @Sabeeh 的答案是正确的,只更新你的 gradle 中的库

    compile 'com.facebook.stetho:stetho:1.3.1'
    compile 'com.facebook.stetho:stetho-okhttp:1.3.1'
    compile 'com.facebook.stetho:stetho-urlconnection:1.3.1'
    compile 'com.squareup.okhttp:okhttp:2.3.0'
    compile 'com.mcxiaoke.volley:library:1.0.19'
    

    现在在项目的 Application 类中添加这个

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

    导入您的库,但我们会看到 OkHttpStack(okHttpClient) 出现错误,因此您只需复制@bryanstern Class OkHttpStack 提供的此代码,然后创建文件导入并享受它

    【讨论】:

    • 您好,我很好奇您如何使用 OkHTTPStack 处理 SSL?我目前在 Volley 中使用带有 SSL 的 HurlStack,并想切换到 OkHTTP,这样我就可以使用 Stetho 进行网络跟踪。
    【解决方案3】:

    如果您想在不使用 OkHttp 堆栈的情况下使用 Stetho 进行 volley。

    请参考此链接。 Stetho for Volley

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 2015-03-13
      相关资源
      最近更新 更多