Я использую Picasso для отображения изображения в моем приложении для Android:
/**
* load image.This is within a activity so this context is activity
*/
public void loadImage (){
Picasso picasso = Picasso.with(this);
picasso.setDebugging(true);
picasso.load(quiz.getImageUrl()).into(quizImage);
}
У меня включена отладка, и он всегда показывает красный и зеленый, но никогда не показывает желтый
Теперь, если я загружаю то же изображение в следующий раз, а Интернет недоступен, изображение не загружается.
Вопросы:
- У него нет кеша на локальном диске?
- Как включить кэширование диска, если я буду использовать один и тот же образ несколько раз.
- Нужно ли мне добавить разрешение на диск в файл манифеста Android?
Ответы:
Вот что я сделал. Работает хорошо.
Сначала добавьте OkHttp в файл сборки gradle модуля приложения:
Затем сделайте класс, расширяющий
Application
добавьте его в файл манифеста следующим образом:
Теперь используйте Пикассо, как обычно. Без изменений.
РЕДАКТИРОВАТЬ:
если вы хотите использовать только кешированные изображения. Назовите библиотеку так. Я заметил, что если мы не добавим networkPolicy, изображения не будут отображаться при полностью автономном запуске, даже если они кэшированы . Приведенный ниже код решает проблему.
РЕДАКТИРОВАТЬ # 2
проблема с приведенным выше кодом заключается в том, что если вы очистите кеш, Picasso продолжит поиск его в автономном режиме в кеше и потерпит неудачу, следующий пример кода смотрит на локальный кеш, если он не найден в автономном режиме, он подключается к сети и пополняет кеш.
источник
okhttp3.OkHttpClient
библиотекой вы должны использоватьOkHttp3Downloader
форму классаcompile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
1) ответ на первый вопрос: по методу Picasso Doc for With ()
Но
Disk Cache
операция для глобального Пикассо по умолчанию доступна только в API 14+.2) ответ на второй вопрос:
Picasso
использоватьHTTP
запрос клиента кDisk Cache
операции Таким образом , вы можете сделать свой собственныйhttp request header
имеет свойствоCache-Control
сmax-age
и создать свой собственный статический Picasso Instance вместо умолчанию Пикассо Используя1] HttpResponseCache (Примечание: работает только для API 13+)
2] OkHttpClient (работает для всех API)
Пример использования
OkHttpClient
для создания собственного статического класса Пикассо:Сначала создайте новый класс, чтобы получить собственный одноэлементный
picasso
объектиспользуйте свой собственный одноэлементный
picasso
объект вместоPicasso.With()
PicassoCache.getPicassoInstance(getContext()).load(imagePath).into(imageView)
3) ответ на третий вопрос: вам не нужны права доступа к диску для операций с дисковым кешем.
Ссылки : проблема Github с дисковым кешем , на два вопроса ответил @ jake-wharton -> Question1 и Question2
источник
FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.squareup.okhttp.OkHttpClient
okhttp
Для кеширования я бы использовал перехватчики OkHttp, чтобы получить контроль над политикой кеширования. Посмотрите этот образец, который включен в библиотеку OkHttp.
RewriteResponseCacheControl.java
Вот как я бы использовал это с Пикассо -
источник
Для самой последней версии 2.71828 Это ваш ответ.
Q1 : У него нет кеша на локальном диске?
A1 : в Picasso есть кеширование по умолчанию, и поток запросов такой же
Везде, где они впервые встретили свое изображение, они будут использовать это изображение, а затем остановят поток запросов. А как насчет потока ответов? Не волнуйтесь, вот оно.
По умолчанию они сначала сохраняются на локальном диске для расширенного кэша хранения. Затем память для экземпляра использования кеша.
Вы можете использовать встроенный индикатор в Picasso, чтобы увидеть, где формируются изображения, включив его.
В левом верхнем углу ваших изображений появится флажок.
Q2 : Как включить кэширование диска, если я буду использовать один и тот же образ несколько раз?
A2 : Вам не нужно его включать. Это по умолчанию.
Что вам нужно сделать, так это ОТКЛЮЧИТЬ, если вы хотите, чтобы ваши изображения всегда были свежими. Есть 2 способа отключения кеширования.
.memoryPolicy()
для no_cache и / или NO_STORE и поток будет выглядеть следующим образом .NO_CACHE пропустит поиск изображений в памяти.
NO_STORE пропустит сохранение изображений в памяти при первой загрузке изображений.
.networkPolicy()
для no_cache и / или NO_STORE и поток будет выглядеть следующим образом .NO_CACHE пропустит поиск изображений с диска.
NO_STORE пропустит сохранение изображений на диске при первой загрузке изображений.
Вы не можете ОТКЛЮЧИТЬ ни то, ни другое для полного отсутствия кеширования изображений. Вот пример.
Поток полностью без кеширования и без сохранения будет выглядеть так.
Таким образом, вам может потребоваться это также, чтобы минимизировать использование хранилища вашего приложения.
В3 : нужно ли мне добавить разрешение на диск в файл манифеста Android?
A3 : Нет, но не забудьте добавить разрешение INTERNET для вашего HTTP-запроса.
источник
1) Пикассо по умолчанию имеет кеш (см. Ответ Ахмеда Хамди)
2) Если вам действительно нужно взять изображение из кеша диска, а затем из сети, я рекомендую написать свой собственный загрузчик:
А в Application singleton в методе OnCreate используйте его с picasso:
3) Не требуются разрешения для папки кеша приложений defalut
источник
Добавьте следующий код и
Application.onCreate
используйте его как обычноЕсли вы сначала кешируете изображения, сделайте что-то подобное в
ProductImageDownloader.doBackground
и загружайте изображения как обычно или с кешированием на диске
Примечание:
Красный цвет означает, что изображение получено из сети. .
Зеленый цвет означает, что изображение загружено из кэш-памяти .
Синий цвет указывает на то, что изображение загружено из дисковой памяти .
Перед выпуском приложения удалите или установите его
false
picasso.setLoggingEnabled(true);
,picasso.setIndicatorsEnabled(true);
если не требуется. Thankxисточник
Я не знаю, насколько хорошо это решение, но это определенно ЛЕГКОЕ, которое я только что использовал в своем приложении, и оно работает нормально
вы загружаете изображение вот так
Вы можете получить
bimap
подобноеТеперь закройте это
Bitmap
вJPG
файл и сохраните в кеше, ниже приведен полный код для получения bimap и его кеширования.get()
методPiccasso
для какой - то причине нужно назвать на отдельном потоке, я спасаю этот образ также на том же потоке.После сохранения изображения вы можете получить все подобные файлы
теперь вы можете найти файл, который ищете, как показано ниже
источник
Я использую этот код и работал, может быть, вам пригодится:
источник
У меня была та же проблема, и я использовал вместо нее библиотеку Glide. Кеш там из коробки. https://github.com/bumptech/glide
источник