android - 如何避免 Picasso 对调整大小的图像重复发出网络请求?

标签 android image android-lifecycle picasso

当我使用Picasso时在不同的 Activity 中并监视网络请求,我看到第一个 Activity 创建了图像 A 的网络请求。在加载图像 A 之前,用户可以点击某处并打开第二个 Activity ,该 Activity 也加载图像 A。现在我看到第二个 Activity 已打开网络请求来再次获取A,这意味着下载同一图像两次。

有没有办法告诉 Picasso 等待第一个请求完成并重用其结果以避免消耗带宽?

更新:经过更多测试后,我发现该问题与单独的 Activity 无关。我从头开始创建了一个测试,其中两个不同的 Activity 加载了图像,并且为这两个 Activity 完成了一个请求,这非常棒。然而,我的生产应用程序中的行为不断发生,很可能是由于图像被调整大小并裁剪为不同的尺寸。在一项 Activity 中,用户图像显示为裁剪后的小圆圈,而在另一项 Activity 中,则显示不调整大小。这是重现该问题的示例:

    String IMAGE_URL = "http://www.elhaso.es/temp/big.jpg";
    Picasso.with(this)
            .load(IMAGE_URL)
            .into(mImage1);
    Picasso.with(MainActivity.this)
            .load(IMAGE_URL)
            .resize(233, 333).centerCrop()
            .into(mImage2);

由于 .resize(233, 333).centerCrop() 行,此代码将打开并下载图像 URL 两次,尽管它们是相同的资源。如果删除此行,Picasso 将执行单个请求并在图像之间共享结果。既然不调整大小的行为很好,这可能是一个错误吗?根据记录,这是使用 2.5.0 发生的。

最佳答案

要使用 Picasso 暂停和恢复请求,请首先添加一个标签:

Picasso.with(context)
   .load("http://example.com/image.jpg")
   .tag(someTag)
   .into(someImageView)

然后调用

picasso.resumeTag(someTag);

picasso.pauseTag(someTag);

同样,要取消请求,请使用

picasso.cancelRequest();

因此,您需要在 onPause()onResume 中调用 pauseTag()resumeTag() ActivityFragment 类的 () 方法,以及类似 onStop() 中的 cancelRequest() 方法> 和onDestroy()

引用请参见here 。请记住,您需要新 jar (v2.5.0)完成这一切。

Jake Wharton 的“错误答案”下面严厉批评的是:

Picasso doesn't play well with the Activity / Fragment lifecycles. Volley does. You can cancel an ongoing request from onPause() or onDestroy() or onStop(). You can even cancel all ongoing requests in one shot (messy, but it works).

So the short answer to your question is NO, because Picasso can't help you out with with the Activity / Fragment lifecycles.

关于android - 如何避免 Picasso 对调整大小的图像重复发出网络请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28644278/

相关文章:

android - 需要密码才能运行某些应用程序?

android - 如何为长文本设计 Chips 布局

javascript - 将数组显示为平均堆栈中的图像(节点+ Angular 等..)

Android 关于生命周期回调 onPause() 和 onStop() 的矛盾文档

java - 从 IntentService 调度递归处理程序以重试 http 调用

jquery - 使用 jQuery 拉伸(stretch)图像以填充整个 div,它在窗口调整大小时调整大小

html - 无法使用 CSS 对齐图像 slider 中的文本

android - 如何获取最后一个 onPause fragment 触发器?

android - android Activity 生命周期函数的基础知识

android - 如何将 Onclick 监听器添加到回收站 View