当我在不同的活动中使用Picasso并监控网络请求时,我看到的是第一个活动为图像A创建网络请求。在加载图像A之前,用户可以点击某处并打开第二个活动它还会加载图像A.现在我看到第二个网络请求已经打开以再次获取A ,这意味着下载两次相同的图像。
有没有办法告诉Picasso等待第一个请求完成并重用其结果以避免消耗带宽?
更新:经过多次测试后,我发现问题与单独的活动没有任何关系。我从头开始创建一个测试,其中两个不同的活动加载了一个图像,并且两个请求都完成了,这很棒。然而,我的生产应用程序中的行为一直在发生,可能是由于图像被调整大小并裁剪为不同的大小。在一个活动中,用户图像显示为裁剪的微型圆圈,而另一个活动则显示没有调整大小。这是一个再现问题的例子:
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()
行而属于同一资源。如果删除此行,Picasso将执行单个请求并在图像之间共享结果。由于没有调整大小的行为是好的,这可能是一个错误吗?对于记录,这发生在使用2.5.0。
答案 0 :(得分:4)
要暂停和恢复Picasso
的请求,请先添加标记:
Picasso.with(context)
.load("http://example.com/image.jpg")
.tag(someTag)
.into(someImageView)
然后致电
picasso.resumeTag(someTag);
或
picasso.pauseTag(someTag);
同样,要取消请求,请使用
picasso.cancelRequest();
因此,在这些方面,您需要在pauseTag()
& resumeTag()
和onPause()
和onResume()
方法中调用Activity
和Fragment
。 cancelRequest()
类onStop()
以及onDestroy()
和Picasso
中的类似Activity
。
供参考,请参阅here。请记住,您需要新的jar (v2.5.0)才能完成所有这些。
以下Jake Wharton严厉批评的“错误答案”是:
Fragment
与onPause()
/onDestroy()
的效果不佳 生命周期。Volley
确实。您可以从onStop()
或取消正在进行的请求Picasso
或Activity
。您甚至可以取消所有正在进行的请求 一次性(凌乱,但它有效)。所以对你的问题的简短回答是否定的,因为
Fragment
不能 使用{{1}} / {{1}}生命周期帮助您。