2015-01-22 3 views
1

Я собираю миниатюры с веб-сервера в AsynTask для каждого класса, который я создаю по мере его создания. Для этой конкретной проблемы я показываю миниатюру и некоторые свойства текста в ListView.Поиск изображений медленный

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

Я хотел бы получить некоторые предложения от всех вас прекрасных людей об этом.

Примечание: Я также попытался получить изображения в адаптере ListView, но 1) он получает каждое изображение каждый раз, когда прокручивается ListView, и 2) он невероятно глючит, потому что, поскольку каждое изображение загружается, я могу смотреть изображения появляются в неправильном элементе списка, а затем он волшебным образом исправляет себя через некоторое время. Это было совсем не так, поэтому я переместил код в класс.

Буду признателен за любые советы, которые бросили мой путь.

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

public Bitmap GetThumbnail_xlarge() throws Exception { 

    if(_thumbnail_xlarge == null) { 
     if(_thumbnailBasePath != null) { 
      try {new DownloadImageTask(_thumbnail_xlarge).execute(_thumbnailBasePath + "/portrait_xlarge." + _thumbnailExtension); } 
      catch (Exception e) {} //TODO: The extension could be incorrect. Do nothing for now. 
     } 
     else{ throw new Exception("You must set the thumbnail path before getting the image"); } 
    } 

    return _thumbnail_xlarge; 
} 

И вот этот класс, который выполняет эту работу. Обратите внимание, что это частный класс внутри класса, где живет свойство изображения:

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
     Bitmap bmImage; 

     public DownloadImageTask(Bitmap bmImage) { 
      this.bmImage = bmImage; 
     } 

     protected Bitmap doInBackground(String... urls) { 
      String urldisplay = urls[0]; 
      Bitmap mIcon11 = null; 
      try { 
       InputStream in = new java.net.URL(urldisplay).openStream(); 
       mIcon11 = BitmapFactory.decodeStream(in); 
      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
      return mIcon11; 
     } 

     protected void onPostExecute(Bitmap result) { _thumbnail_xlarge = result; } 
    } 

Я не могу думать ни о чем другом, что может иметь отношение в это время. Пожалуйста, спросите меня, если необходимо, и заблаговременно заблаговременно!

ответ

2

Это невероятно полезно для сохранения изображений локально для последующего использования. Кстати, это называется кешированием. Это полезно, поскольку вы сохраняете ресурсы, и вы можете сократить сетевые запросы, которые используют множество из них.

Если изображения большие, вы можете использовать формат WebP. WebP - это формат изображения, который является «без потерь и сжатия с потерями для изображений в Интернете». Изображения без потерь WebP на 26% меньше по размеру по сравнению с PNG. Изображения с потерей WebP на 25-34% меньше по сравнению с изображениями JPEG при эквивалентном индексе SSIM «. Подробнее о формате WebP вы можете найти здесь: https://developers.google.com/speed/webp/?csw=1

Также, если вы хотите плавно загружать изображения в ListView, вы должны использовать шаблон ViewHolder. Больше информации здесь: http://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder

+0

Спасибо за целую кучу информации! – firstTimeJavaUser

+1

Рад, что я помог вам –

Смежные вопросы