OkHttp源码探究(一)---基本使用

吐槽

自己也要进入安卓全面学习状态了,这块网络请求之前自己用的一点也不好,写项目的时候发行自己各种问题和后台交互的时候,而且自己源码什么的还没开始看,就很尴尬,就拿这个okhttp当自己第一个阅读的源码吧。

本文思维导图

//以后写东西的时候都先拿思维导图构建好思路
这里写图片描述

本文前的准备什么的,我之前写的博客里面有
之前写的博客

Get请求

同步的方法

先看整体的代码
同步GET的意思是一直等待http请求, 直到返回了响应. 在这之间会阻塞进程, 所以通过get不能在Android的主线程中执行, 否则会报错.

private void initSyncData(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Request request = new Request.Builder().url("http://www.baidu.com").build();
                    Response response = client.newCall(request).execute();
                    result = response.body().string();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            textView.setText(result);
                            Log.d("233","sync");
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

1.先实例化okhttp,构建一个request,使用的是get方式,放入一个url地址就可以了,也可以通过Request.Builder设置更多的参数。
2.然后通过client发起一个请求,放入队列。等待任务完成,在Callback中取结果。
3.通过response.body().string()获取返回来的字符串。
这个body()其实就是ResponseBody的对象

先看
第一句

OkHttpClient client=new OkHttpClient(); //创建一个okhttpClient实例

然后我进入OkHttpClient这个类的源码时候,,,,我直接懵逼了,都什么鬼啊啊啊啊,看的我一脸懵逼,然后我还是继续坚持看下去吧。

public class OkHttpClient implements Cloneable, Call.Factory, WebSocket.Factory {
   
  static final List<Protocol> DEFAULT_PROTOCOLS = Util.immutableList(
      Protocol.HTTP_2, Protocol.HTTP_1_1);

  static final List<ConnectionSpec> DEFAULT_CONNECTION_SPECS = Util.immutableList(
      ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT);
      ...........
      final Dispatcher dispatcher;
  final @Nullable Proxy proxy;
  final List<Protocol> protocols;
  final List<ConnectionSpec> connectionSpecs;
  final List<Interceptor> interceptors;
  final List<Interceptor> networkInterceptors;
  final EventListener.Factory eventListenerFactory;
  final ProxySelector proxySelector;
  final CookieJar cookieJar;
  final @Nullable Cache cache;
  final @Nullable InternalCache internalCache;
  final SocketFactory socketFactory;
  final @Nullable SSLSocketFactory sslSocketFactory;
  final @Nullable CertificateChainCleaner certificateChainCleaner;
  final HostnameVerifier hostnameVerifier;
  final CertificatePinner certificatePinner;
  final Authenticator proxyAuthenticator;
  final Authenticator authenticator;
  final ConnectionPool connectionPool;
  ..........

第二步
这个总算看到网址了,这块就和网络请求HTTP这块有关系了

Request request = new Request.Builder().url(url) .build(); //创建一个Request实例

先看下Request类的源码,这块终于能看懂了,这个不就是HTTP下的请求报文哈哈哈,啦啦啦
http协议请求消息体分为4部分请求行、请求头部、空行和请求数据
请求行又包含请求方法,请求地址,请求协议
这里写图片描述

public final class Request {
   
  final HttpUrl url;//请求地址
  final String method;//请求方法
  fi
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值