OkHttp库源码解析

OkHttp库使用及源码解析

特点

  • OkHttp是一个高效的Http客户端,有如下的特点:
  • 支持HTTP2/SPDY黑科技
  • socket自动选择最好路线,并支持自动重连
  • 拥有自动维护的socket连接池,减少握手次数
  • 拥有队列线程池,轻松写并发
  • 拥有Interceptors轻松处理请求与响应(比如透明GZIP压缩,LOGGING)
  • 基于Headers的缓存策略

使用

OkHttp是由Square开发的网络通信库,使用前先添加依赖库

dependencies {
    ...
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
}

不要忘记声明使用网络的权限

<uses-permission android:name="android.permission.INTERNET" />

一个简单的GET请求的步骤(阻塞方式):

  • 创建一个OkHttpClient对象
  • 创建一个Request对象
  • 调用client.newCall(request)创建Call对象
  • 调用call.execute()执行请求(阻塞)
try
                {
                    OkHttpClient client = new OkHttpClient();
                    Request request = new Request.Builder() //这里创建了Builder对象,然后进行配置
                            .url("http://www.baidu.com")
                            .build(); //创建Request对象
                    Response response = client.newCall(request).execute(); //创建一个Call对象,然后发送请求,response接收返回的数据,此方法blocks直到响应返回
                    String message = response.message();    //response状态
                    String responseData = response.body().string(); //将返回的数据转换为字符串
                    Log.d(TAG, "message : " + message);
                    Log.d(TAG, "data: \n" + responseData);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }

当请求的域名不存在时会抛出异常:java.net.UnknownHostException

更好的用法(异步)

来自CSDN博客

//创建okHttpClient对象
OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder()
                .url("https://github.com/hongyangAndroid")
                .build();
//new call
Call call = mOkHttpClient.newCall(request); 
//请求加入调度
call.enqueue(new Callback()
        {
            @Override
            public void onFailure(Request request, IOException e)
            {
                //这里处理请求时发生的异常
            }

            @Override
            public void onResponse(final Response response) throws IOException
            {
                //这里处理返回的response
            }
        }); 

调用enqueue()方法使得call的执行是异步的,不影响其他代码的执行。
当请求执行完后,会回调Callback里的方法,我们可以在里面执行我们的代码。

查看源码可以知道onFailure调用的时机:

Called when the request could not be executed due to cancellation, a connectivity problem or timeout.
当request由于取消、连接问题或者超时导致不能完成的情况下调用。

提交数据的POST请求

代码如下,其它跟上面的一样

RequestBody requestBody = new FormBody.Builder()
                            .add("username", "admin")
                            .add("password", "123456")
                            .build();

                    Request request = new Request.Builder() //这里创建了Builder对象,然后进行配置
                            .url("http://www.baidu.com")
                            .post(requestBody)
                            .build(); //创建Request对象

Builder的post()方法

public Builder post(RequestBody body) {
      return method("POST", body);
    }

当Builder调用了po

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于OkHttp来说,可以通过它提供的ResponseBody来获取服务器返回的JSON数据和图片数据。 1. JSON解析 使用OkHttp获取服务器返回的JSON数据,可以通过如下步骤进行解析: ```java // 1. 创建OkHttpClient实例 OkHttpClient client = new OkHttpClient(); // 2. 创建Request对象 Request request = new Request.Builder() .url("http://www.example.com/api/get_data") .build(); // 3. 发送请求,获取Response对象 Response response = client.newCall(request).execute(); // 4. 获取ResponseBody对象 ResponseBody body = response.body(); // 5. 获取JSON字符串 String jsonStr = body.string(); // 6. 解析JSON数据 JSONObject jsonObject = new JSONObject(jsonStr); int code = jsonObject.getInt("code"); String message = jsonObject.getString("message"); ``` 以上代码中,我们通过OkHttpClient发送了一个请求,获取了服务器返回的Response对象,然后从Response对象中获取了ResponseBody对象,最后通过ResponseBody对象获取了JSON字符串。接下来,我们就可以使用Android提供的JSONObject或第三方Gson、FastJson等来解析这个JSON字符串。 2. 图片解析 使用OkHttp获取服务器返回的图片数据,可以通过如下步骤进行解析: ```java // 1. 创建OkHttpClient实例 OkHttpClient client = new OkHttpClient(); // 2. 创建Request对象 Request request = new Request.Builder() .url("http://www.example.com/images/pic.png") .build(); // 3. 发送请求,获取Response对象 Response response = client.newCall(request).execute(); // 4. 获取ResponseBody对象 ResponseBody body = response.body(); // 5. 获取图片字节数组 byte[] bytes = body.bytes(); // 6. 将字节数组转换为Bitmap对象 Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); ``` 以上代码中,我们通过OkHttpClient发送了一个请求,获取了服务器返回的Response对象,然后从Response对象中获取了ResponseBody对象,最后通过ResponseBody对象获取了图片字节数组。接下来,我们可以使用Android提供的BitmapFactory将字节数组转换为Bitmap对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值