0

我正在使用这种方法来存储来自服务器的大型响应以便稍后解析它(在 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 ?

4

3 回答 3

0

如果您尝试获取流并解析它怎么办?

InputStream inputStream = entity.getContent();
FileOutputStream output = new FileOutputStream(path); 
String path = "file.txt";
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
    output.write(buffer, 0, len);
}

通过这种方式,您可以按顺序获取流。我认为没有办法做到这一点。

试着让我知道。:)

于 2013-07-01T22:58:52.093 回答
0

这看起来很奇怪,因为如果您正在连接和断开连接,它应该会抛出超时响应代码。但是对于你目前的情况,我认为你能做的最好的就是在打开的文件代码中添加try-catch,如果有异常,弹出一个说下载文件不完整或其他东西,删除该文件并要求用户尝试再次。(对不起,我没有足够的声誉来回复)

于 2013-07-02T08:17:24.923 回答
-2

尝试使用onFinsh();保存到文件

于 2013-07-01T23:10:48.220 回答