如何避免使用Picasso重复调整图像的网络请求?

时间:2015-02-21 09:38:10

标签: android image android-lifecycle picasso

当我在不同的活动中使用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。

1 个答案:

答案 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()方法中调用ActivityFragmentcancelRequest()onStop()以及onDestroy()Picasso中的类似Activity

供参考,请参阅here。请记住,您需要新的jar (v2.5.0)才能完成所有这些。

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

  

FragmentonPause() / onDestroy()的效果不佳   生命周期。   Volley   确实。您可以从onStop()或取消正在进行的请求   PicassoActivity。您甚至可以取消所有正在进行的请求   一次性(凌乱,但它有效)。

     

所以对你的问题的简短回答是否定的,因为Fragment不能   使用{{1}} / {{1}}生命周期帮助您。