Picasso Image再次下载了不同尺寸的ImageView?

Ste*_*lla 16 java android picasso

我在我的应用程序中使用Picasso有效地加载图像并且正在最好地完成他的工作.问题是,目前如果我Picasso.with()使用相同的URL多​​次调用 ,但是每次使用具有不同尺寸的图像视图时,图像获得下载again.In Glide我们的方法 .diskCacheStrategy()DiskCacheStrategy.SOURCE解决的problem.is有毕加索任何替代办法?

这个查询中,我们将获得Glid的解决方案但不适用于Picasso.how我可以重用图像而无需重新加载不同尺寸的ImageView.

这是我正在使用的代码

Picasso.with(context)
                .load(URI)
                .placeholder(R.drawable.ic_profile_thumb)
                .resize(180, 180).centerInside()
                .into(viewHolder.imgThumbnail);
Run Code Online (Sandbox Code Playgroud)

nul*_*ter 8

Picasso没有将图像缓存到磁盘,Picasso只有一个内存缓存.磁盘缓存由网络库(OKhttp)完成.因此写入磁盘缓存的映像永远不会重新调整大小.

如果多次下载相同的网址图像,则可能需要检查网络库.

如果您的项目使用okhttp库,那么picasso会自动将其用作默认下载程序.如果您正在使用任何其他网络库,则必须编写自己的下载程序并使用它进行设置

Picasso.Builder(context).downloader(customDownloader)
Run Code Online (Sandbox Code Playgroud)

这个链接可能会让事情变得清晰


Sot*_*tti 5

毕加索默认情况下不会调整图像大小.如果你像下一个那样做一个简单的电话......

Picasso.with(context).load("https://goo.gl/v9EkbF").into(imageView);
Run Code Online (Sandbox Code Playgroud)

...毕加索正在缓存全尺寸图像.从那时起,每次调用相同的URL时,Picasso都会重用该全尺寸图像,让GPU在视图中调整大小.

使用resize()方法只缓存已调整大小的图像,如果使用不同的大小,Picasso将需要再次下载图像.

不要使用resize()选项,您将获得更好的带宽使用率,但要小心内存使用情况.

毕加索的默认值

毕加索确实有自动内存和磁盘缓存.最近请求的任何图像都将在内存缓存中.如果没有Picasso将检查磁盘缓存.如果它在磁盘上不可用,那么Picasso才会启动网络请求.

所有请求的图像都存储在两个缓存中,直到必须删除它们才能释放空间.

2.5.2中的默认值是:

  • LRU内存缓存可用应用程序RAM的15%
  • 2%存储空间的磁盘缓存高达50MB但不低于5MB.
  • 毕加索将使用OkHttp作为Http客户端,如果它作为Gradle依赖项包含在内.否则毕加索将回归HttpUrlConnection.

您可以像这样增加磁盘缓存(示例为100MB):

    Picasso picasso =  new Picasso
        .Builder(this)
        .downloader(new OkHttpDownloader(getCacheDir(), 100000000))
        .build();

    Picasso.setSingletonInstance(picasso);
Run Code Online (Sandbox Code Playgroud)

更改光盘缓存大小不会更改缓存策略.

内存政策

  • MemoryPolicy.NO_CACHE:图像不会从内存中提供.这个不能避免从磁盘提供图像.避免磁盘查看网络策略.
  • MemoryPolicy.NO_STORE:图像不会存储在内存中.将其用于仅加载一次的图像.

Picasso
        .with(context)
        .load(https://goo.gl/v9EkbF)
        .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
        .into(imageView);
Run Code Online (Sandbox Code Playgroud)

网络政策

  • NetworkPolicy.NO_CACHE:不会从磁盘缓存提供映像.
  • NetworkPolicy.OFFLINE:图像将(如果可能)仅从缓存(内存或磁盘)提供,但从不从网络提供.

例:

Picasso
        .with(context)
        .load(https://goo.gl/v9EkbF)
        .networkPolicy(NetworkPolicy.NO_CACHE)
        .into(imageView);
Run Code Online (Sandbox Code Playgroud)

内存和缓存注意事项

  • Glide默认使用RGB565并将调整大小的图像缓存到内存中.
  • Picasso默认使用RGB888并将全尺寸图像缓存到内存中,让GPU在绘制时进行实时调整.

RGB565的尺寸是RGB888的一半.使用RGB565和更小图像的结果是毕加索的内存占用率(可能是3倍/ 4倍)比Glide更高.

这些只是默认值.Glide可以配置为使用RGB888和Picasso来使用RGB565.Picasso可以配置为只调整像Glide这样经过调整大小的图像.

在相同的设置下,内存占用几乎相同.

带宽考虑因素

  • Glide为每种大小缓存单独的文件.如果您加载另一个大小的同一图像,它将再次下载,调整大小,然后缓存.
  • Picasso始终从缓存中获取全尺寸图像,然后让GPU调整视图大小.

您可以要求Glide缓存所有内容,全尺寸图像和调整大小的图像,但默认情况下Glide的带宽消耗更高.

注意

毕加索2.6即将到来,我不知道什么是不同的/新的.

来源