0

Я использую Пикассо для обработки загрузки изображений и кэширование в моем проекте Android Udacity и я заметил, кэширование не работает, как я бы ожидать:Пикассо Кэширование не кажется, работает

enter image description here

Как вы можете видеть на левом фрагменте, изображение уже загружено в более ранний поток. Теперь, с той же ссылкой URL, я прошу Пикассо разместить это изображение в фрагменте справа.

Вот код, который генерирует вид сетки на левом фрагменте (и происходит первый):

https://github.com/esend7881/udacity-android-popmovie/blob/a9a1b9a19a37594bb5edd736b7ec59229fb5905a/app/src/main/java/com/ericsender/android_nanodegree/popmovie/adapters/GridViewAdapter.java#L71

String load = String.format(sImgUrl, sImgSize, movie.poster_path); 

    Picasso.with(mContext.getApplicationContext()) 
      .load(load) 
      .placeholder(R.drawable.abc_btn_rating_star_on_mtrl_alpha) 
      .error(R.drawable.abc_btn_rating_star_off_mtrl_alpha) 
      .resize(550, 775) 
      .into(viewHolder.imageView); 

А то вот код, который работает в нужном фрагменте:

https://github.com/esend7881/udacity-android-popmovie/blob/a9a1b9a19a37594bb5edd736b7ec59229fb5905a/app/src/main/java/com/ericsender/android_nanodegree/popmovie/fragments/MovieDetailsFragment.java#L308

Picasso.with(getActivity().getApplicationContext()) 
      .load(String.format(sImgUrl, sImgSize, mMovieObj.poster_path)) 
      .error(R.drawable.blank) 
      .fit()// .resize(366, 516) 
      .into(mMovieThumb, new com.squareup.picasso.Callback() { 
       @Override 
       public void onSuccess() { 
        Utils.log(sw.toString()); 
        Utils.hideViewSafe(mMovieThumbProgress); 
       } 

       @Override 
       public void onError() { 
        Utils.log(sw.toString()); 
        Utils.hideViewSafe(mMovieThumbProgress); 
       } 
      }); 

Я использую тот же контекст приложения в каждом, а также текст загрузки:

String.format(sImgUrl, sImgSize, mMovieObj.poster_path))

и

getActivity().getApplicationContext()

Так, я думаю, Пикассо должен определить, когда точно такой же нагрузки URL ссылка появляется в том же контексте в течение короткого периода времени друг от друга, и Пикассо затем загрузит то же самое изображение обратно в приложение.

Если это не так, как работает кеширование Пикассо, то как это сделать?

+0

Не знаете, как это работает, но я думаю: размер имеет значение. Пикассо, создающее разные версии одного и того же изображения, может объяснить это поведение. – zapl

+0

Хмм, я бы подумал, что Пикассо загрузит необработанное изображение, а затем изменит размер в следующем вызове. Если это на самом деле то, что делает Пикассо (только кеширование точного размера), есть ли способ отключить его, а кеш Пикассо - исходное изображение? –

ответ

1

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

Я рекомендую использовать https://github.com/facebook/fresco вместо пикассо. Это более эффективно, особенно с разными размерами. Вы также можете напрямую обращаться к кешированным файлам, если требуется https://github.com/facebook/fresco/issues/80

+0

Я должен проверить это, спасибо! –

0

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

Попробуйте загрузить изображение на imgur, попробуйте выполнить hardcoding этот путь и посмотрите, работает ли он. Если это так, вам нужно найти обходное решение о том, как получить изображение из базы данных фильмов.

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