25

我正在使用 Picasso 库进行图像加载,但遇到了问题。当图像无法加载时,我想隐藏视图而不是加载默认图像。我从源代码中注意到,添加侦听器的唯一方法似乎是来自构建器,但是当图像加载失败时,永远不会调用错误方法。有人对此有经验吗?

    iv = (ImageView) findViewById(R.id.imageView);

    Picasso.Builder builder = new Picasso.Builder(getApplicationContext());
    builder.listener(new Picasso.Listener() {

        @Override
        public void onImageLoadFailed(Picasso arg0, String arg1) {
            Log.e("Picasso Error", "Errored out, hiding view");
            iv.setVisibility(View.GONE);
        }
    });
    Picasso pic = builder.build();
    pic.load("thisshouldbreak.jpg").into(iv);
4

6 回答 6

52

Picasso 2.0 允许您将回调附加到请求中。

https://github.com/square/picasso

您正在使用的回调用于“全局”侦听器,它可以帮助您调试由于网络负载而可能发生的错误。

load(url).into(view, new Callback() {...});在毕加索 2.0 中使用。

如果cancelRequest(target)您使用的是Callback.

于 2013-07-30T06:37:01.697 回答
19

我的例子:

Picasso picasso = new Picasso.Builder(parent.getContext())
            .listener(new Picasso.Listener() {
                @Override
                public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
                //Here your log
                }
            })
            .build();
    picasso.load(shopModel.getShopImg())
            .fit()
            .into(viewHolder.shopImg);
于 2015-07-24T10:57:54.063 回答
5

您可以尝试添加一个“全局”侦听器。

    // create Picasso.Builder object
    Picasso.Builder picassoBuilder = new Picasso.Builder(this);

    picassoBuilder.listener(new Picasso.Listener() {
        @Override
        public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
            Log.e("PICASSO", uri.toString(), exception);
        }
    });

    // Picasso.Builder creates the Picasso object to do the actual requests
    Picasso picasso = picassoBuilder.build();

    try {
        Picasso.setSingletonInstance(picasso);
    } catch (IllegalStateException ignored) {
        // Picasso instance was already set
        // cannot set it after Picasso.with(Context) was already in use
    }

任何后续调用都Picasso.with(Context context)将返回连接到侦听器的实例,因此将记录所有失败。

请注意,您需要尽快致电setSingletonInstance,例如在 Application 中onCreate

从这里采用的 PS 代码 -使用 Picasso.Builder 自定义毕加索

于 2016-06-01T13:42:17.520 回答
4

我的答案:

File file = new File(filePath);
        Picasso.with(context).load(file).placeholder(R.drawable.draw_detailed_view_display).error(R.drawable.draw_detailed_view_display)
        .resize(400, 400).into(mImageView, new Callback() {

            @Override
            public void onSuccess() {

            }

            @Override
            public void onError() {
                mImageView.setVisibility(View.GONE);
            }
        });
于 2015-10-30T04:02:14.527 回答
2

当我们得到错误时,错误转到onError方法,然后我们处理它!

private void getAvatar(){
        Picasso.with(this)
                .load(Links.GET_AVATAR + ".jpg")
                .into(imgUserAvatar, new Callback() {
                    @Override
                    public void onSuccess() {

                    }

                    @Override
                    public void onError() {
                        imgUserAvatar.setImageResource(R.drawable.icon_profile_default);
                    }
                });
}
于 2017-09-19T19:16:55.613 回答
1

只是一个建议,但如果你制作一个“空”的 png 文件并将其设置为 res 文件夹中的默认图像文件,你可能会避免编程中的问题......我知道有点傻......但可能会在不打架的情况下工作...... .

于 2013-10-22T13:38:11.143 回答