2016-02-02 1 views
5

Это приложение с видом галереи. Использование REST Я получаю (Volley) JSON, который содержит информацию о месте и нескольких ссылках на фотографии. Потому что существует около 60 мест, поэтому недостаточно кэшировать форму PICASSO. Данные хранятся в БД, поэтому я решил включить изображение в базу данных как byte stream. Это сделано, но не так хорошо, как показано ниже. Код внутри AsyncTask.Подход к изображениям для Android в БД

@Override 
protected Bitmap doInBackground(Void... params) { 
    try { 
     return Picasso.with(context) 
       .load(site.getImageURL()) 
       .get(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

@Override 
protected void onPostExecute(Bitmap bitmap) { 
    super.onPostExecute(bitmap); 

    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    try { 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    site.setImageBytes(stream.toByteArray()); 

    db.openForWrite(); 
    db.updateSite(site.getId(), site); 
    db.close(); 
} 

Вопрос: как сделать его эффективным, знаете ли вы, как лучше это сделать? Я попробовал callback Пикассо, чтобы добавить изображение в БД onSuccess, но для этого требуется представление в качестве первого аргумента.

Возможно, есть хороший способ сохранить изображения на SD-карте и заменить ссылку HTTP на местоположение изображения на SD-карте.

Или кэширование изображения непосредственно на диск?

+0

Использование кеша. Если у вас больше изображений, вам необходимо использовать Disk Cache –

+0

. Я бы предложил загрузить и сохранить изображение на SDCard и сохранить этот путь в db и проверить, существуют ли они, если не скачать тот, который присутствует на SDCard – sector11

ответ

0

Возможно, есть хорошие способы сохранения изображений на SD-карту и замена ссылки на HTTP с расположением изображения на SD-карте.

Или кэширование изображения непосредственно на диск?

Именно это я и сделаю. Посмотрите на кеш на SD, если изображение присутствует, если да, используйте его, если не загрузите его в кэш и используйте его из кеша. Но вам нужно позаботиться о TTL-s.

1

Я хотел бы предложить вам пойти с кэшированием, рассмотреть возможность использования Universal Image Loader библиотеки Сергей Тарасевич (GitHub)

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

  • UsingFreqLimitedMemoryCache -> Наименее часто используемое растровое изображение удаляется при превышении лимита размера кеша.
  • LRULimitedMemoryCache: -> Меньше всего используемое растровое изображение удаляется при превышении лимита размера кеша.
  • FIFOLimitedMemoryCache: -> Правило FIFO используется для удаления при превышении лимита размера кеша.
  • LargestLimitedMemoryCache: -> Максимальное растровое изображение удаляется при превышении лимита размера кеша.
  • LimitedAgeMemoryCache:> Объект Cached удаляется, когда его возраст превышает определенное значение.
  • WeakMemoryCache: -> Кэш памяти с слабыми ссылками на растровые изображения.
0

@Biju Парвати ответ нормально, но с 27 ноября Всеобщий Image Loader было остановить проект сохранения. Вы можете видеть это в своих github page

Я думаю, что очень хорошая альтернатива - использование Fresco Library. Является из Facebook и поддерживает local storage cache и многое другое.Некоторые из свойств кэша:

кэша Bitmap

закодированные кэш-память

Дисковый кэш

Использование одного дискового кэша или два

Его очень проста в использовании и время загрузки изображений очень быстро. Также он поддерживает потоковую передачу progressive JPEG images over the network.

1

Для кэширования изображений в андроиде есть определенный механизм.

  1. LruCache
  2. DiskCache
  3. Хранить в БД

Если изображения не большой & не более (2-3 КБ) и коллекция из них не должен быть расширен, то вы можете сохранить их в db. Но было бы сложнее их написать, прочитайте их. С другой стороны, пользователь не сможет ничего с ними сделать.

В противном случае, если вы хотите, чтобы пользователь расширил коллекцию изображений или изображения довольно большие, вы должны сохранить их на sd card (Disk cache).

Примечание: - Я рекомендую использовать библиотеку Glide с механизмом кэширования диска

Glide

Рассмотрим пространство lackness и рассматривать эти дела надлежащим образом.

+0

Спасибо за ссылку. Glide действительно приятно! – Serafins

+0

@Serafins Прочтите этот учебник для получения дополнительной информации. Http://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en –

0

Как вы можете видеть, «bitmap.compress (Bitmap.CompressFormat.JPEG, 100, stream);» метод принимает выходной поток для сохранения растрового изображения.

Просто используйте FileOutputStream и выберите место для сохранения изображения!

3

Есть несколько вопросов, чтобы отметить здесь:

  1. onPostExecute работает на основном потоке. Не очень хорошее место для работы с диском ввода-вывода. Пользовательский интерфейс будет время от времени зависать при отображении изображений.

  2. Шаблоны SqLite быстрее, чем файлы с открытым диском только для ограниченных размеров (Benchmark). Таким образом, большие файлы лучше сохраняются на диске.

  3. Использование Picasso рекомендуется, если вы хотите, чтобы кешированная ленивая загрузка изображений. Проблема в том, что Picasso не позволит легко использовать ваше пользовательское решение «DB as cache». Он использует HTTP-кеш общего назначения.Следовательно, кэшированные файлы могут периодически быть недействительными и очищаться.

Если вы хотите полностью настроить HTTP и загрузку изображений, попробуйте что-нибудь наподобие Volley.