【问题标题】:Picasso Caching Doesn't Appear to be working毕加索缓存似乎不起作用
【发布时间】:2015-10-12 11:41:17
【问题描述】:

我在我的 Android Udacity 项目中使用 Picasso 处理图像加载和缓存,我注意到缓存没有像我预期的那样工作:

如您在左侧片段中所见,图像已在较早的线程中加载。现在,使用相同的 URL 链接,我要求 Picasso 将该图像放在右侧的片段中。

这是在左侧片段上生成网格视图的代码(并且首先出现):

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()

所以,我认为 Picasso 应该检测到完全相同的 URL 加载链接何时出现在相同的上下文中,并且在很短的时间内彼此出现,然后 Picasso 会将完全相同的图像加载回应用程序中。

如果这不是毕加索缓存的工作方式,那么它是如何工作的?

【问题讨论】:

  • 不确定它是如何工作的,但我猜:尺寸很重要。毕加索创建同一张图片的不同版本可以解释这种行为。
  • 嗯,我原以为毕加索会下载原始图像,然后在随后的调用中调整大小。如果这实际上是毕加索正在做的事情(只缓存确切的大小),有没有办法禁用它并让毕加索缓存原始图像?

标签: android caching android-fragments android-activity picasso


【解决方案1】:

正如评论中提到的,我猜这是受到两个片段中图像大小不同的影响。

我建议使用https://github.com/facebook/fresco 而不是毕加索。它更有效,尤其是在不同尺寸的情况下。如果需要,您也可以直接访问缓存文件https://github.com/facebook/fresco/issues/80

【讨论】:

    【解决方案2】:

    这可能与获取不允许缓存的图像时收到的 HTTP 标头有关,因为 Picasso 依赖 HTTP 组件进行缓存。

    尝试在 imgur 上上传您的图片,尝试对该路径进行硬编码,看看它是否有效。如果是这种情况,您将不得不找到一种解决方法,了解如何从电影数据库中获取图像。

    【讨论】:

      猜你喜欢
      • 2018-02-05
      • 1970-01-01
      • 2011-10-19
      • 2011-09-03
      • 2011-03-09
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多