前言
名称 | 开发者 | 时间 | 备注 |
---|---|---|---|
Retrofit | Square | JakeWharton | |
OkHttp | Square | 2013-05-06 | |
Volley | 2013 | 适合数据量大,需要频繁通信的网络操作。不适用文件的上传下载操作。 | |
Android-Async-Http | |||
Apache HttpClient | Apache | API 23:Android 6.0上被删除 | |
HttpURLConnection | JDK | java.net包下 |
官网
https://square.github.io/okhttp/
项目地址
https://github.com/square/okhttp
Maven
https://search.maven.org/artifact/com.squareup.okhttp3/okhttp
核心类
- OkHttpClient
- Request
- RealCall——AsyncCall
- Dispatcher
使用方法
第一步:创建 OkHttpClient 对象
OkHttpClient client = new OkHttpClient();
// 构造方法,默认Builder配置
public OkHttpClient() {
this(new Builder());
}
Builder 默认配置信息
public Builder() {
dispatcher = new Dispatcher();
protocols = DEFAULT_PROTOCOLS;
connectionSpecs = DEFAULT_CONNECTION_SPECS;
eventListenerFactory = EventListener.factory(EventListener.NONE);
proxySelector = ProxySelector.getDefault();
cookieJar = CookieJar.NO_COOKIES;
socketFactory = SocketFactory.getDefault();
hostnameVerifier = OkHostnameVerifier.INSTANCE;
certificatePinner = CertificatePinner.DEFAULT;
proxyAuthenticator = Authenticator.NONE;
authenticator = Authenticator.NONE;
connectionPool = new ConnectionPool();
dns = Dns.SYSTEM;
followSslRedirects = true;
followRedirects = true;
retryOnConnectionFailure = true;
connectTimeout = 10_000;
readTimeout = 10_000;
writeTimeout = 10_000;
pingInterval = 0;
}
如果需要设置拦截器 Interceptor
- addInterceptor(Interceptor interceptor)
- addNetworkInterceptor(Interceptor interceptor) 无网络时不会调用
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new HttpLoggingInterceptor())
.cache(new Cache(cacheDir, cacheSize))
.build();
第二步:请求网络
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
- execute() 同步请求
- enqueue(Callback responseCallback) 异步请求
Dispatcher
private int maxRequests = 64;
private int maxRequestsPerHost = 5;
private @Nullable ExecutorService executorService;
// 双端队列
private final Deque<AsyncCall> readyAsyncCalls = new ArrayDeque<>();
synchronized void enqueue(AsyncCall call) {
if (runningAsyncCalls.size() < maxRequests && runningCallsForHost(call) < maxRequestsPerHost) {
runningAsyncCalls.add(call);
executorService().execute(call);
} else {
readyAsyncCalls.add(call);
}
}
// 创建线程池
public synchronized ExecutorService executorService() {
if (executorService == null) {
executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false));
}
return executorService;
}
RealCall
AsyncCall(Runnable)
- Response getResponseWithInterceptorChain()
@Override protected void execute() {
boolean signalledCallback = false;
try {
Response response = getResponseWithInterceptorChain();
if (retryAndFollowUpInterceptor.isCanceled()) {
signalledCallback = true;
responseCallback.onFailure(RealCall.this, new IOException("Canceled"));
} else {
signalledCallback = true;
responseCallback.onResponse(RealCall.this, response);
}
} catch (IOException e) {
if (signalledCallback) {
// Do not signal the callback twice!
Platform.get().log(INFO, "Callback failure for " + toLoggableString(), e);
} else {
eventListener.callFailed(RealCall.this, e);
responseCallback.onFailure(RealCall.this, e);
}
} finally {
client.dispatcher().finished(this);// 移出队列
}
}
// 责任链模式
Response getResponseWithInterceptorChain() throws IOException {
// Build a full stack of interceptors.
List<Interceptor> interceptors = new ArrayList<>();
interceptors.addAll(client.interceptors());// 自定义拦截器
interceptors.add(retryAndFollowUpInterceptor);// 重试拦截器
interceptors.add(new BridgeInterceptor(client.cookieJar()));
interceptors.add(new CacheInterceptor(client.internalCache()));// 缓存拦截器
interceptors.add(new ConnectInterceptor(client));
if (!forWebSocket) {
interceptors.addAll(client.networkInterceptors());
}
interceptors.add(new CallServerInterceptor(forWebSocket));
Interceptor.Chain chain = new RealInterceptorChain(interceptors, null, null, null, 0,
originalRequest, this, eventListener, client.connectTimeoutMillis(),
client.readTimeoutMillis(), client.writeTimeoutMillis());
return chain.proceed(originalRequest);
}
、、、缓存、、、
- CacheStrategy
- DiskLruCache