OkHttp3Stack volley

package com.yong.volleyok.okhttp;
   
  import com.android.volley.AuthFailureError;
  import com.android.volley.Request;
  import com.android.volley.toolbox.HttpStack;
   
  import org.apache.http.HttpEntity;
  import org.apache.http.HttpResponse;
  import org.apache.http.ProtocolVersion;
  import org.apache.http.StatusLine;
  import org.apache.http.entity.BasicHttpEntity;
  import org.apache.http.message.BasicHeader;
  import org.apache.http.message.BasicHttpResponse;
  import org.apache.http.message.BasicStatusLine;
   
  import java.io.IOException;
  import java.util.Map;
  import java.util.concurrent.TimeUnit;
   
  import okhttp3.Headers;
  import okhttp3.MediaType;
  import okhttp3.OkHttpClient;
  import okhttp3.Protocol;
  import okhttp3.RequestBody;
  import okhttp3.Response;
  import okhttp3.ResponseBody;
   
  /**
  * <b>Project:</b> com.yong.volleyok <br>
  * <b>Create Date:</b> 2016/4/22 <br>
  * <b>Author:</b> qingyong <br>
  * <b>Description:</b> 使用OkHttp作为Volley的请求的实现 <br>
  */
  public class OkHttp3Stack implements HttpStack {
   
  private final OkHttpClient mClient;
   
  public OkHttp3Stack(OkHttpClient client) {
  this.mClient = client;
  }
   
  private static HttpEntity entityFromOkHttpResponse(Response response) throws IOException {
  BasicHttpEntity entity = new BasicHttpEntity();
  ResponseBody body = response.body();
   
  entity.setContent(body.byteStream());
  entity.setContentLength(body.contentLength());
  entity.setContentEncoding(response.header("Content-Encoding"));
   
  if (body.contentType() != null) {
  entity.setContentType(body.contentType().type());
  }
  return entity;
  }
   
  @SuppressWarnings("deprecation")
  private static void setConnectionParametersForRequest
  (okhttp3.Request.Builder builder, Request<?> request)
  throws IOException, AuthFailureError {
  switch (request.getMethod()) {
  case Request.Method.DEPRECATED_GET_OR_POST:
  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 RequestBody createRequestBody(Request request) throws AuthFailureError {
  final byte[] body = request.getBody();
  if (body == null) return null;
  return RequestBody.create(MediaType.parse(request.getBodyContentType()), body);
  }
   
  private static ProtocolVersion parseProtocol(final Protocol protocol) {
  switch (protocol) {
  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");
  }
   
  @Override
  public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)
  throws IOException, AuthFailureError {
  int timeoutMs = request.getTimeoutMs();
  OkHttpClient client = mClient.newBuilder()
  .readTimeout(timeoutMs, TimeUnit.MILLISECONDS)
  .connectTimeout(timeoutMs, TimeUnit.MILLISECONDS)
  .writeTimeout(timeoutMs, TimeUnit.MILLISECONDS)
  .build();
   
  // 请求构造器
  okhttp3.Request.Builder okHttpRequestBuilder = new okhttp3.Request.Builder();
   
  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);
   
  // 请求
  okhttp3.Request okhttp3Request = okHttpRequestBuilder.
  url(request.getUrl()).
  build();
   
  // 响应
  Response okHttpResponse = client.newCall(okhttp3Request).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;
  }
  }
时间: 2024-10-01 20:28:04

OkHttp3Stack volley的相关文章

Android Volley+OkHttp3+Gson 开源库的封装

博客将按照下面的步骤介绍Volley的重新封装: 1.OkHttp3的关于Volley的HttpStack实现 2.HttpRequest的实现和HttpListener回调监听的封装 3.Volley原始的Request的Wrap 4.各种方式的请求的重新实现 5.统一请求的实现 6.使用 所需依赖: compile 'com.android.volley:volley:1.0.0' compile 'com.squareup.okio:okio:1.7.0' compile 'com.squ

Volley使用

Volley 简单使用示例 1.添加网络访问权限 <uses-permission android:name="android.permission.INTERNET" /> 2.创建一个RequestQueue对象.RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求.RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,

Android热门网络框架Volley详解

.Volley简介 volley的英文意思为‘群发’.‘迸发’.Volley是2013年谷歌官方发布的一款Android平台上的网络通信库.Volley非常适合一些数据量不大,但需要频繁通信的网络操作.使用Volley进行网络开发可以使我们的开发效率得到很大的提升,而且性能的稳定性也比较高.但是Volley不适用于文件的上传下载操作. Volley的特点: >1 使网络通信更快,更简单,更健壮: >2 Get/Post网络请求及网络图像的高效率异步请求: >3 可以对网络请求的优先级进行

Volley随笔之文件缓存DiskBasedCache类

Volley提供了一个基于文件的缓存类DiskBasedCache保存缓存数据.这个类完成缓存工作的原理大致如此,首先声明一个文件夹,文件夹下的文件与cacheKey一一对应,也就是说每一个文件时不同网络请求的返回数据.文件的格式是这样,文件头是数据结构CacheHeader,描述了缓存的信息,之后就是缓存数据. 下面是DiskBasedCache的代码,不得不说很优美! /*  * Copyright (C) 2011 The Android Open Source Project * * L

Android Volley解析(一)之GET、POST请求篇

一. Volley 的地位 自2013年Google I/O 大会上,Google 推出 Volley 之后,一直到至今,由于其使用简单.代码轻量.通信速度快.并发量大等特点,倍受开发者们的青睐. 先看两张图,让图片告诉我们 Volley 的用处: 第一张 Volley 的经典图 通过上图,我们可以发现 Volley适合网络通信频繁操作,并能同时实现多个网络通信. 第二张图 我们在以前在 ListView 的 item 中如果有网络请求,一般都是通过Task 异步任务来完成,并在完成之后通知 A

优化ListView中的网络图片加载 及 Volley库源码分析

使用适当的开源库,如Volley或者Universal ImageLoader 以Volley库为例.Volley使用了线程池来作为基础结构,主要分为主线程,cache线程和network线程. 主线程和cache线程都只有一个,而NetworkDispatcher线程可以有多个,这样能解决比并行问题.如下图: 其中左下角是NetworkDispatcher线程,大致步骤是: 1.不断从请求队列中取出请求 request = mQueue.take(); 2.发起网络请求 NetworkResp

Volley框架源码浅析(一)

尊重原创http://blog.csdn.net/yuanzeyao/article/details/25837897 从今天开始,我打算为大家呈现关于Volley框架的源码分析的文章,Volley框架是Google在2013年发布的,主要用于实现频繁而且粒度比较细小的Http请求,在此之前Android中进行Http请求通常是使用HttpUrlConnection和HttpClient进行,但是使用起来非常麻烦,而且效率比较地下,我想谷歌正式基于此种原因发布了Volley框架,其实出了Voll

Android Volley 之自定义Request

可以在Ext.QuickTips.init();后加入如下代码: Ext.MessageBox.buttonText = { ok : "确定", cancel : "取消", yes : "是", no : "否" }; Android Volley 之自定义Request,码迷,mamicode.com

通过Volley加载包含大量图片的ListView

什么是Volley? 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,2013年的GoogleI/O大会上,Volley发布了.Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮. 这是Volley名称的由来:a burst or emission of many things or a largeamount at onc