OKHttp源码解析 1:同步与异步请求使用方法

OKHttp同步请求

主要分为四个步骤:
1. 首先需要创建OkHttpClient类,它是一个客户端类,这个类是整个OKHttp库里很重要的一个类,很多的功能都需要经过这个客户端类来转发和实现。创建方式有两种,一种是直接 new 创建,另外一种就是常用的通过Builder方式创建,这种方式可以设置各种参数。

//创建OkHttpClient,这里只简单设置了超时时间为10秒
OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout(10,TimeUnit.SECONDS).build();

2.创建Request,请求报文体信息。一般也是通过Builder方式创建。

//创建Request
Request request = new Request.Builder().url("http://www.baidu.com").build();

3.创建Call对象,代表实际的http请求,连接Request和Response的桥梁。Call对象其实是一个接口,真正的实现在RealCall对象里。

//创建Call对象,代表实际的http请求,可以当做是连接Request和Response之间的桥梁
Call call = okHttpClient.newCall(request);

4.调用Call的execute()方法,完成响应报文的读取。

//同步调用execute()方法
Response response = call.execute();

上面四步就是整个OKHttp同步请求的调用步骤了,下面是整体的核心代码。

    //创建OkHttpClient,这里只简单设置了超时时间为10秒
    OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout(10, TimeUnit.SECONDS).build();

    /**
     * 同步请求
     */
    private void syncRequest() {
        //创建Request
        Request request = new Request.Builder().url("http://www.baidu.com").build();
        //创建Call对象,代表实际的http请求,可以当做是Response与Request之间的桥梁
        Call call = okHttpClient.newCall(request);
        try {
            //同步调用execute()方法
            Response response = call.execute();
            Log.e("-----response----", response.body().toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

需要注意的是:OKHttp同步发送请求后,就会进入阻塞状态,直到收到响应。


OKHttp异步请求

异步请求的前三步和同步请求一样,都是创建OKHttpClient和Request对象以及通过OKHttpClient调用newCall()创建Call对象。第四步就不一样了,调用的是Call对象的enqueue()方法进行异步请求,代码如下:

//创建OkHttpClient,这里只简单设置了超时时间为10秒
OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout(10, TimeUnit.SECONDS).build();

/**
 * 异步请求
 */
private void asyncRequest() {
    //创建Request
    Request request = new Request.Builder().url("http://www.baidu.com").get().build();
    //创建Call对象,代表实际的http请求,可以当做是Response与Request之间的桥梁
    Call call = okHttpClient.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.e("-----onFailure----", e.getMessage());
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            Log.e("-----response----", response.body().toString());
        }
    });
}

需要注意的是,onFailure和OnResponse都是在工作线程,也就是在子线程中执行的。

总结

  1. 发起请求的方法不一样。同步调用的方法为execute(),异步为enqueue();
  2. 同步会阻塞当前线程,而异步不会,还会新开一个子线程去处理网络请求。

到这里,OKHttp同步与异步请求的基本使用就讲完了,很简单,内容也很少。但是这是我们分析OKHttp源码的起点,所以这个章节还是不可缺少的,冲下一篇文章中,我们就开始慢慢深入OKHttp源码,一步一步的去领略OKHttp源码的魅力。

下一篇 OKHttp源码解析 2:同步请求与异步请求流程和源码分析

猜你喜欢

转载自blog.csdn.net/qq_14904791/article/details/80106238
今日推荐