吐槽
自己也要进入安卓全面学习状态了,这块网络请求之前自己用的一点也不好,写项目的时候发行自己各种问题和后台交互的时候,而且自己源码什么的还没开始看,就很尴尬,就拿这个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