Как загрузить и кэшировать растровое изображение с помощью библиотеки Picasso
Я использую следующий метод
Bitmap bitmap = Picasso.with(ListofCardsActivity.this)
.load(overLayUrl).get();
для загрузки и получения изображения из веб-url.
загружает ли этот метод изображение с url-адреса каждый раз, даже если оно уже загружено?
Я хочу, чтобы после загрузки изображения, а затем со следующего раза, я должен получить изображение из кэша, нет необходимости загружать.
Если у нас есть метод, подобный приведенному выше требованию. пожалуйста, дайте мне знать
2 ответов
загружает ли этот метод изображение с url-адреса каждый раз, даже если оно уже загружено?
нет, если он кэшируется.
на Picasso
экземпляр вы получите обратно с with()
предварительно настроен для кэширования памяти и дискового кэша.
в зависимости от того, сколько вы скачиваете, вы можете работать из кэша. И я надеюсь, что Пикассо использует такие вещи, как ETag
и If-Modified-Since
загрузите изображения, если изображение изменилось на сервере, хотя я не изучал их код, чтобы увидеть, если они это делают, так как это поведение не документировано.
загружает ли этот метод изображение с url-адреса каждый раз, даже если оно уже загружено? Нет, если он кэшируется.
согласно документации и исходному коду, Picasso ничего не кэширует при использовании synchronous get () метод.
Итак, вот мое решение для загрузки изображения синхронно и кэширования его с Picasso:
File fileImage = new File("/path/to/your/image");
final Bitmap[] bmpRes = new Bitmap[1];
final Semaphore semaphore = new Semaphore(0);
Picasso.with(this).load(fileImage).priority(Picasso.Priority.HIGH).into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
bmpRes[0] = bitmap;
semaphore.release();
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
semaphore.release();
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
try {
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(bmpRes[0] != null) {
Bitmap bmp = bmpRes[0];
//TODO: Whatever you want with the bitmap
} else {
//TODO: Failed to load the image
}