用回调函数在Picasso中获取图片?

14

我想展示一组照片,照片之间没有间隔,在一个规则间隔内更换。我意识到Picasso在开始下载之前初始化ImageView,并且无论是否在调用into()之前fetch(),它总是这样做。

我使用fetch()来保持图片之间的间隙小,并使用.placeholder(R.color.black),但即使从内存加载图像,间隙仍然可见。

我的代码看起来像这样

Picasso.with(getContext()).load(url).fetch();

然后会有一定的延迟时间 [目前是固定的,我希望根据网络速度进行调整]

Picasso.with(getContext()).load(url).into(screenSurface);

我注意到fetch()不支持任何回调参数并且返回void,因此似乎无法知道缓存何时预热。

两个问题:

  1. 当图像被缓存时,我能否得到通知?
  2. 是否有其他方法可以消除图像之间的间隙并使它们正常显示。

[我知道我可以手动编码解决这个问题,但如果Picasso支持,我想使用它。]

5个回答

17
根据源代码显示,fetch完成后不会执行任何操作,包括通知潜在的监听器。不幸的是,FetchAction不是公共类,因此您也无法覆盖这个功能。
您可以通过使用自定义的Target子类来解决此问题,例如:
Picasso.with(getContext()).load(url).into(new Target() {
    @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        // cache is now warmed up
    }
    @Override public void onBitmapFailed(Drawable errorDrawable) { }
    @Override public void onPrepareLoad(Drawable placeHolderDrawable) { }
});

这很好,但我意识到我不能像以前那样使用.fit()或.centerCrop()等函数,这并不是问题,因为我可以在ImageView中设置适当的属性。但我想知道的是,使用Target()是否会对缓存图像产生任何影响。这些图像是否被缓存为下载的图像,因此我可以在不同大小的预览中使用它们?还是我需要手动.resize()或类似的操作? - Oliver Hausler
2
在使用我的解决方案的变通方法后,您可以调用 load(url).fit().into(screenSurface),只要 url 相同,我相信它将从缓存中加载。 - bmat

5
我知道这是一个较旧的问题,但 fetch() 命令允许回调函数,如 fetch(Callback callback)。 该命令有一个 onSuccess() 和一个 onError() 回调函数,用于请求的 URI 加载。
请参见这里获取 javadoc 的详细信息。

0

我尝试了noPlaceholder方法来解决问题。我尝试了很多方法,但最终发现问题是让前一张图片等待下一张图片。


0

谢谢,我知道into()中的回调函数并正在使用它,但为了获得平滑的图像序列,我需要在调用into()之前获取图像加载的信息。我将研究实现自己的磁盘缓存,这可能会解决问题。 - Oliver Hausler

0
截至Picasso 2.7版本,它确实支持使用fetch()方法的回调。
Picasso.get()
                    .load(url)
                    .fetch(new Callback() {
                        @Override
                        public void onSuccess() {
                            //Success
                        }
                        @Override
                        public void onError(Exception e) {
                            //Error
                        }});

2
是的,但位图(Bitmap)在哪里? - user28434'mstep
真是个糟糕的API设计,求你提供Bitmap onSuccess。 - frankelot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接