2015-08-14 3 views
5

creato una classe Singleton volley per i miei requests.This è la mia classe singletonCome usare Stetho con 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); 
    } 
} 

e M utilizzano OKHTTP impilare con il mio Volley implementation.This è il mio 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); 
    } 
} 

ho anche la mia intilized Stetho in my application.class

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

Il problema si verifica quando eseguo il debug Non riesco a ottenere le chiamate di rete effettuate dalla mia applicazione in il mio browser. Non so dove sto andando male! Aiuto!

risposta

8

Aggiungere questo file nel progetto Updated OkHttpStack

e

Prova questa:

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

con i seguenti dipendenze:

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' 
+0

Ciao, sono curioso di sapere come gestisci SSL con OkHTTPStack? Sto attualmente utilizzando HurlStack con SSL in Volley e vorrei passare a OkHTTP in modo da poter usare Stetho per l'analisi della rete. – Woppi

1

la risposta di @Sabeeh è corretta, aggiornare solo le tue librerie nel tuo 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' 

Ora nella classe applicazione del progetto aggiungere questo

Stetho.initializeWithDefaults(this); 

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

importare i librerie e tuttavia vedremo un errore con OkHttpStack (okHttpClient) modo che solo bisogno di copiare questo codice fornito da @bryanstern Class OkHttpStack quindi crea il file importato e goditelo

+0

Ciao, sono curioso di sapere come gestisci SSL con OkHTTPStack? Sto attualmente utilizzando HurlStack con SSL in Volley e vorrei passare a OkHTTP in modo da poter usare Stetho per l'analisi della rete. – Woppi

+0

grazie, grazie mille! –