Picasso 图片加载回调

49
我想使用Picasso在ListView中加载三张连续的图片。使用Picasso提供的方法可以轻松实现。然而,由于这些图片在不同的时间加载,会导致闪烁效果,例如有时候图像2先于图像1出现,并且当图像1加载时会引起不自然的卡顿效果。最好的解决办法是将ListView的可见性设置为不可见,直到所有图像都可用于显示。然而,在Picasso中没有找到可用于指示图像何时已加载的回调方法。
请问有人知道如何使用Picasso解决这种情况吗?
谢谢。

1
@ElectronicGeek,我认为OP提出问题的方式很好。他在问题中解释了他已经完成的工作(他已经实现了图像加载但是遇到了闪烁问题),并且询问Picasso是否提供某种图像加载回调来解决这个问题。这完全没有任何问题。 - Alex Lockwood
5个回答

66

@jamrockRay现在应该已经修复了。 - Olivier Payen
回调没有被调用。 - Cătălin Florescu

47

以下是一个简单的示例,演示如何实现 Picasso 图片加载的回调函数:

Picasso.with(MainActivity.this)
            .load(imageUrl)
            .into(imageView, new com.squareup.picasso.Callback() {
                        @Override
                        public void onSuccess() {
                            //do smth when picture is loaded successfully

                        }

                        @Override
                        public void onError() {
                            //do smth when there is picture loading error
                        }
                    });

在最新的Picasso版本中,onError方法接收一个Exception参数,并使用get()而不是with()方法。

Picasso.get()
            .load(imageUrl)
            .into(imageView, new com.squareup.picasso.Callback() {
                        @Override
                        public void onSuccess() {
                            //do smth when picture is loaded successfully

                        }

                        @Override
                        public void onError(Exception ex) {
                            //do smth when there is picture loading error
                        }
                    });

9
您可以像下面展示的那样使用Picasso实现回调:
ImageHandler.getSharedInstance(getApplicationContext()).load(imString).skipMemoryCache().resize(width, height).into(image, new Callback() {
            @Override
            public void onSuccess() {
                layout.setVisibility(View.VISIBLE);
            }

            @Override
            public void onError() {

            }
        });
}

以下是我的ImageHandler类的实现代码:
public class ImageHandler {

    private static Picasso instance;

    public static Picasso getSharedInstance(Context context)
    {
        if(instance == null)
        {
            instance = new Picasso.Builder(context).executor(Executors.newSingleThreadExecutor()).memoryCache(Cache.NONE).indicatorsEnabled(true).build();
        }
        return instance;
    }
}

3

这是使用简单的Picasso回调将图像URL加载到ImageView中

           Picasso.with(this)
            .load(Picurl)
            .into(Imageview, new Callback() {
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onError() {


                        }
                    }
            );

这是使用更多回调函数的Picasso图像加载方式

private void loadImage() {
    Picasso.with(this)
            .load(PicURL)
            .into(mContentTarget);
  }


private Target mContentTarget = new Target() {
    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
    Imageview.setImageBitmap(bitmap);
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {
    }
};

你可以为你的代码添加一些进一步的解释。 - LuckyLikey

0
你可以使用 Target 对象。一旦 target1 接收到回调,你可以下载第二个资源,然后在 target2 中获取回调,接着触发第三次下载。

这样做非常浪费,而且比并发加载要花费更长的时间。 - zyamys

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