【问题标题】:Picasso Library, Android: Using Error ListenerPicasso Library,Android:使用错误监听器
【发布时间】:2013-06-07 19:12:32
【问题描述】:

我正在使用 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);

【问题讨论】:

    标签: android listener


    【解决方案1】:

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

    https://github.com/square/picasso

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

    在 Picasso 2.0 中使用 load(url).into(view, new Callback() {...});

    如果您使用的是Callback,请记住调用cancelRequest(target)

    【讨论】:

    • 如何获得毕加索 2.0 ?我只看到 1.1.1。
    • 手动获取源码并构建jar。即将正式发布。
    • @howettl 在这里获取Picasso2
    • @dnkoutso 加载时如何使用进度条?
    • 问题是 onError 没有提供有关错误的信息。而且,我的 onImageLoadFailed 永远不会像问题所说的那样被调用。
    【解决方案2】:

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

    【讨论】:

    • 不是一个实用的方法。当然,在某些情况下,如果图像 url 不是有效格式,这是一个很好的建议。但是如果某些 url 是 1. //cdn.bla2.com/sample.png 2. cdn.bla2.com/sample .png 在这种情况下它会出错,因为只有前缀所以它也很好检查这个错误
    • 它有效,但感谢您花时间投票否决 emil...提供解决方案的重点是该解决方案有效
    • 顺便说一句emil...你可能想看看日期...我在毕加索2出来之前解决了他的问题...当然更年轻的答案取决于它...
    【解决方案3】:

    我的例子:

    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);
    

    【讨论】:

      【解决方案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);
                  }
              });
      

      【讨论】:

      • 您好,感谢您的支持,似乎对代码多一点解释会更有帮助
      【解决方案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,例如在应用程序onCreate

      附:从这里采用的代码 - Customizing Picasso with Picasso.Builder

      【讨论】:

      • 谢谢!这也允许我使用自定义 okhttpclient 使用自签名证书。
      【解决方案6】:

      当我们得到错误时,错误转到 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);
                          }
                      });
      }
      

      【讨论】:

      • 你参加聚会有点晚了 :P 这是 4 年前 onError 存在之前的情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      相关资源
      最近更新 更多