为我的请求创建了一个凌空单例类.这是我的单例类
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'