Android 我如何避免毕加索在网络上重复请求调整大小的图像?
当我在不同的活动中使用并监视网络请求时,我看到的是第一个活动为图像a创建了一个网络请求。在加载图像a之前,用户可以点击某个位置并打开第二个活动,该活动也加载了图像a。现在我看到第二个网络请求已经打开,再次获取图像a,这意味着下载两次相同的图像 有没有办法让毕加索等到第一个请求完成并重用其结果,以避免占用带宽 更新:经过一点测试后,我发现问题与单独的活动无关。我从头开始创建了一个测试,其中两个不同的活动加载了一个映像,并为这两个映像执行了一个请求,这非常棒。然而,我的制作应用程序中的这种行为一直在发生,很可能是因为图像被调整大小并裁剪成不同的大小。在一个活动中,用户图像显示为一个裁剪的小圆圈,在另一个活动中,用户图像显示时不调整大小。下面是一个重现问题的示例:Android 我如何避免毕加索在网络上重复请求调整大小的图像?,android,image,android-lifecycle,picasso,Android,Image,Android Lifecycle,Picasso,当我在不同的活动中使用并监视网络请求时,我看到的是第一个活动为图像a创建了一个网络请求。在加载图像a之前,用户可以点击某个位置并打开第二个活动,该活动也加载了图像a。现在我看到第二个网络请求已经打开,再次获取图像a,这意味着下载两次相同的图像 有没有办法让毕加索等到第一个请求完成并重用其结果,以避免占用带宽 更新:经过一点测试后,我发现问题与单独的活动无关。我从头开始创建了一个测试,其中两个不同的活动加载了一个映像,并为这两个映像执行了一个请求,这非常棒。然而,我的制作应用程序中的这种行为一直在
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(233333).centerCrop()
行的原因,此代码将打开并下载两次图像url,尽管它们是相同的资源。如果删除这一行,毕加索将执行单个请求,并在图像之间共享结果。由于没有调整大小的行为是好的,这可能是一个错误吗?对于记录,这是使用2.5.0实现的。要使用毕加索暂停和恢复请求,请首先添加一个标记:
Picasso.with(context)
.load("http://example.com/image.jpg")
.tag(someTag)
.into(someImageView)
然后打电话
picasso.resumeTag(someTag);
或
同样,要取消请求,请使用
picasso.cancelRequest();
因此,在onPause()
和onResume()
中,需要调用pauseTag()
和onResume()
活动的方法,类似地,在ontop()
和onDestroy()
中调用cancelRequest()
有关参考,请参阅。一定要记住,你需要一个新的罐子来完成这一切
下面批评的“错误答案”是:
毕加索
对活动
/片段
生命周期。
做您可以从onPause()
或取消正在进行的请求
onDestroy()
或onStop()
。您甚至可以取消所有正在进行的请求
在一次拍摄(混乱,但它的工作)
所以你的问题的简短答案是否定的,因为毕加索不能
帮助您完成活动
/片段
生命周期
所以,是的,这是完全错误的。首先,毕加索对暂停、恢复和取消都有相同的控制。其次,在Picasso and Volley中取消实际上并不会取消底层网络请求(如果它已经启动)。你会看到两种行为形式都是一样的。我刚刚又看了一遍图书馆,你是对的,所以我为此道歉。我用
凌空抽射
完成了这些事情,但不是用毕加索
完成的。从现在起,我将避免根据传闻给出答案:)我们为看到像你这样的答案而感到羞耻,而你的答案过去是真实的。所以我们添加了这些功能@GrzegorzAdamHankiewicz:这有用吗?感谢您的努力,我已经知道暂停/恢复,但进一步调查表明,在尝试将错误减少到一个较小的示例后,这不是问题所在。我已经更新了问题的更多细节。嗨@GrzegorzAdamHankiewicz,你找到问题的原因了吗?
picasso.cancelRequest();