Как загрузить и кэшировать растровое изображение с помощью библиотеки 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
    }