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

标签 java android network-programming httpclient http-get

我正在 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/

相关文章:

java - 为什么线程不等待 notify()?

java - 将 Arraylist 作为参数传递给函数

java - 线程 "AWT-EventQueue-0"java.lang.NumberFormatException 中出现异常,但字符串不为空

Android 4.3 BLE Characteristic 怎么写

iphone - CFReadStreamHasBytesAvailable 轮询 - 最佳实践

java - 将现有的 Java 项目从 Java 1.6 升级到 1.8

java - java/android 向循环线程发送消息

android - WatchViewStub 弃用

C++在特定接口(interface)上接收多播

java - 如何中断 ServerSocket accept() 方法?