Загрузите изображение с URL в Android, только если оно маленькое - PullRequest
3 голосов
/ 25 июля 2010

Я использую BitmapFactory.decodeStream для загрузки изображения с URL-адреса в Android.Я хочу загружать только изображения ниже определенного размера, и в настоящее время я использую getContentLength, чтобы проверить это.

Однако мне сказали, что getContentLength не всегда предоставляет размер файла, и в этих случаях я бы хотел остановить загрузку, как только узнаю, что файл слишком большой.Как правильно сделать это?

Вот мой текущий код.В настоящее время я возвращаю ноль, если getContentLength не дает ответа.

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;
}

Ответы [ 3 ]

2 голосов
/ 26 июля 2010

1.Вы также можете попробовать этот подход.Я считаю, что он не будет загружать контент для больших файлов

HttpURLConnection connection = (HttpURLConnection)new URL(url).openConnection();  
int length=connection.getContentLength(); 

if(length<max){  
  InputStream is = connection.getInputStream();  
  BitmapFactory.decodeStream(is,null,null);
}

Это всего лишь пример, вы также можете добавить проверку на -1 и все остальное.Этот подход эквивалентен тому, что вы делаете.Это просто еще один вариант для вас, чтобы попробовать.Я просто знаю, что HttpURLConnection не получает содержимое, пока вы не начнете читать его из потока.Так что этот код не будет загружать большие изображения.Я действительно не знаю, делает ли HttpClient то же самое или нет.

2.Почему на самом деле вы хотите пропустить большие файлы.Если вы беспокоитесь по поводу декодирования durung OutOfMemory, обратите внимание на эту странную проблему нехватки памяти при загрузке изображения в растровый объект .Если вы применяете inSampleSize, вы можете загружать даже большие изображения.Задержка будет больше для больших изображений, но потребление памяти будет низким.Я разместил свой образец ListView здесь Ленивая загрузка изображений в ListView .Отображает изображения в ListView.Есть изображения разных размеров.Не очень большие изображения, но в любом случае.

0 голосов
/ 04 марта 2011

Вот хороший пример, который загружает изображение с сервера. blog.sptechnolab.com / 2011/03/04 / Android / Android-нагрузки изображения из-URL / .

0 голосов
/ 25 июля 2010

Вы должны использовать HttpHead для выдачи запроса HEAD, который похож на GET, но вернет только заголовки. Если длина контента удовлетворительная, вы можете отправить запрос GET на получение контента.

Большинство серверов должны обрабатывать запросы HEAD без проблем, но иногда серверы приложений не ожидают этого и выдают ошибку. Просто что-то, о чем нужно знать.

ОБНОВЛЕНИЕ думал, что я постараюсь ответить и на ваш актуальный вопрос. Вероятно, вам придется прочитать данные в промежуточный байтовый буфер перед передачей данных в BitmapFactory.

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);
}

Не связано, но не забывайте всегда вызывать потребление объекта () для объекта после использования, чтобы HttpClient мог повторно использовать соединение.

...