我用OkHttp库做了一些性能测试,发现它很棒。它向http://httpbin.org/delay/1发出了 80 个请求,在我的 HTC One 手机上,它在 4.7 秒内故意为每个请求暂停 1 秒。我查看了代码,并试图找出为什么它如此之快。开发人员(Square Inc)宣传连接池和异步调用,我相信这两者都有助于良好的性能。
我来自 .NET 世界,在 .NET 4.5 中,您拥有一个真正的异步 HTTP 库,其中包含 Async GetResponse-method。通过在等待响应时将线程让给操作系统,您可以释放资源以启动更多 HTTP 请求或其他内容。问题是我看不到与 OkHttp(或我研究过的任何其他 Android 的 HTTP 库)相同的模式。那么我怎么还能在 4 秒内执行 80 个 1-second-request 呢?它不是基于线程的,对吧?我没有启动 80(或 20)个线程?
具体来说,在com.squareup.okhttp.Call.beginRequest()sendRequest
中,我看到andgetResponse
调用之间没有产生线程:
if (canceled) return null;
try {
engine.sendRequest();
if (request.body() != null) {
BufferedSink sink = engine.getBufferedRequestBody();
request.body().writeTo(sink);
}
engine.readResponse();
} catch (IOException e) {
HttpEngine retryEngine = engine.recover(e, null);
if (retryEngine != null) {
engine = retryEngine;
continue;
}
// Give up; recovery is not possible.
throw e;
}
Response response = engine.getResponse();
那么,如何进行 80 个“并行”调用呢?
我不需要知道这一点就可以使用这个库,但是异步编程让我很感兴趣,我真的很想了解 OkHttp/SquareInc 是如何解决这个问题的。