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