我在android中使用BitmapFactory.decodeStream从url加载图像。我只想下载低于一定大小的图片,目前我正在使用getContentLength来检查这个。
但是,我被告知getContentLength并不总是提供文件的大小,在这种情况下,我想在知道文件太大时立即停止下载。正确的方法是什么?
这是我现在的密码。如果getContentLength不提供答案,则当前返回null。

HttpGet httpRequest = new HttpGet(new URL(urlString).toURI());
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpClient.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
final long contentLength = bufHttpEntity.getContentLength();
if ((contentLength >= 0 && (maxLength == 0 || contentLength < maxLength))) {
    InputStream is = bufHttpEntity.getContent();
    Bitmap bitmap = BitmapFactory.decodeStream(is);
    return new BitmapDrawable(bitmap);
} else {
    return null;
}

最佳答案

您应该使用httphead发出head请求,它类似于get,但只返回header。如果内容长度令人满意,则可以发出get请求以获取内容。
大多数服务器应该可以毫无问题地处理head请求,但有时应用程序服务器不会期望这样做,并且会抛出错误。只是一些需要注意的事情。
我想我也会尽量回答你的实际问题。在将数据传递到位图工厂之前,可能需要将数据读入中间字节缓冲区。

InputStream is = bufHttpEntity.getContent();
ByteArrayOutputStream bytes = ByteArrayOutputStream();
byte[] buffer = new byte[128];
int read;
int totalRead = 0;
while ((read = is.read(buffer)) > 0) {
   totalRead += read;
   if (totalRead > TOO_BIG) {
     // abort download. close connection
     return null;
   }
   bytes.write(buffer, 0 read);
}

不相关,但请记住在使用后始终对实体调用consumercontent(),以便httpclient可以重用连接。

10-04 20:26