gpt4 book ai didi

java - 如何判断 HttpClient.execute() 何时完成获取大型请求中的所有内容?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:20 24 4
gpt4 key购买 nike

我正在 Android 上处理这个问题,但这不是 Android 特有的问题。

使用 org.apache.http.client.HttpClient,我可以向大小为 1kb 的 URL 发出请求,整个响应都包含在 HttpResponse 中:

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("http://10.16.83.67/1kb.log");
HttpResponse response = null;
BufferedReader rd = null;

response = client.execute(request);

然后我可以从响应中获取 HttpEntity:

HttpEntity entity = response.getEntity();
rd = new BufferedReader(new InputStreamReader(entity.getContent()));

然后,使用 BufferedReader...

while ((line = rd.readLine()) != null) {
// ... parse or whatever
}

我正在观察 WireShark,我看到上面的代码在每个方向上都有一个传输:对日志文件的请求,然后整个日志都在响应中传递。

但是,如果我请求更大的文件,比如我的 1MB 日志文件,我会看到一些非常不同的东西。 数据被分块成帧,然后在 rd.readLine() 循环内通过网络传输。

enter image description here

似乎第一个 kb 左右包含在初始响应中。但是当 readLine() 运行时,它会向服务器发出额外的请求,并且数据会流式传输到套接字。如果网络连接中断,我会收到 IO 错误。对于大型请求,entity.isStreaming()true

这是一个异步调用(在 Android 上是强制性的,因为网络调用不能在 UI 线程上进行)但是我不想继续,直到我确定我已经收到了来自这个请求的所有数据.不幸的是,简单地等待一段时间然后继续并希望最好的结果不是一种选择。

我的问题是:我的 HttpClientHttpGetHttpResponseHttpEntity 对象是否知道何时他们已经完成从这个请求中接收数据了吗?还是我必须依赖 BufferedReader 才能知道流何时关闭?

最佳答案

你在使用 AsyncTask 吗?否则你可以这样做

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {}

//执行上面方法中的所有http请求

 protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}

protected void onPostExecute(Long result) {
showDialog("I pop up when all the code in the DoInbackground is finished");
}

关于java - 如何判断 HttpClient.execute() 何时完成获取大型请求中的所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16701521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com