我正在使用这种方法来存储来自服务器的大型响应以便稍后解析它(在 AsyncTask 中):
final HttpClient client = new DefaultHttpClient(new BasicHttpParams());
final HttpGet mHttpGetRequest = new HttpGet(strUrl);
mHttpGetRequest.setHeader("Content-Type", "application/x-www-form-urlencoded");
FileOutputStream fos = null;
try {
final HttpResponse response = client.execute(mHttpGetRequest);
final StatusLine statusLine = response.getStatusLine();
lastHttpErrorCode = statusLine.getStatusCode();
lastHttpErrorMsg = statusLine.getReasonPhrase();
if (lastHttpErrorCode == 200) {
HttpEntity entity = response.getEntity();
fos = new FileOutputStream(reponseFile);
entity.writeTo(fos);
entity.consumeContent();
fos.flush();
}
} catch (ClientProtocolException e) {
e.printStackTrace();
lastHttpErrorMsg = e.toString();
return null;
}
catch (final ParseException e) {
e.printStackTrace();
lastHttpErrorMsg = e.toString();
return null;
}
catch (final UnknownHostException e) {
e.printStackTrace();
lastHttpErrorMsg = e.toString();
return null;
}
catch (IOException e) {
e.printStackTrace();
lastHttpErrorMsg = e.toString();
} finally{
if (fos!=null)
try{
fos.close();
} catch (IOException e){}
}
现在我如何确保完全收到响应并保存到文件中?
假设客户端的设备在代码对文件进行响应时丢失了 Internet 连接。所以应用程序只收到了部分真实响应,并将其写入文件,没有任何错误/异常。它就像流完成/关闭并且 AsyncTask 触发 onPostExecute() 因为作业完成 - 响应写入文件。但关键是 - 没有完全收到回应。而且我很确定它会发生,因为我解析了“标签未关闭”,“文件意外结束”等异常。所以我需要以某种方式检测这种情况,以防止代码解析部分响应,但看不到如何。由于它与文件下载无关,我不能要求它的大小。所以在收到响应之前无法知道响应的大小。
是否有可能检测到这种情况以及如何做到这一点?还是必须在这种情况下引发 IOException ?