【问题标题】:How to listen for Picasso (Android) load complete events?如何监听毕加索(Android)加载完成事件?
【发布时间】:2014-12-20 08:02:54
【问题描述】:

有没有办法在使用构建器时监听来自 Picasso 的事件,例如:

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

我正在尝试在父 GridView 上调用 requestLayout() 和 invalidate(),以便它可以正确调整大小,但我不知道如何设置侦听器或回调。

我看到毕加索有错误事件报告,但是有成功事件吗?

【问题讨论】:

    标签: java android picasso


    【解决方案1】:

    您可以使用Callback 来获取 onSuccess 和 onError 事件。只需像这样向您的请求添加一个新的回调:

    Picasso.with(getContext())
        .load(url)
        .into(imageView, new com.squareup.picasso.Callback() {
                            @Override
                            public void onSuccess() {
    
                            }
    
                            @Override
                            public void onError() {
    
                            }
                        });
    

    然后您可以在 onSuccess 回调中执行任何更改和修改。

    【讨论】:

    • onError() 执行时如何显示错误图片??
    • 使用.error(R.drawable.error_placeholder_image)设置错误图片
    • 如何从 onSuccess 内部访问“this”上下文?我需要更新“this”上下文中的一些变量,以及如何在回调中访问 imageView?谢谢
    • 试试这个 YourClassName.this.yourVariable @sonoluminescence
    • 这在 Kotlin 中会是什么样子?
    【解决方案2】:

    如果您需要在加载到视图之前访问位图,请尝试使用:

    private Target target = new Target() {
          @Override
          public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {       
          }
          @Override
          public void onBitmapFailed() {
          }
    }
    

    在调用方法中:

    Picasso.with(this).load("url").into(target);
    

    理想情况下,您应该直接在视图或视图持有者对象上实现 Target。

    希望对你有帮助

    【讨论】:

    • imgView 在哪里?
    • @NoorHossain 在位图加载时设置图像位图
    【解决方案3】:

    回答 @Jas 跟进问题作为对 MrEngineer13 答案的评论(因为我没有足够的声誉来评论任何答案),您应该在注册 Callback 之前使用 error() 方法在 @987654323 @方法,例如:

    Picasso.with(getContext())
        .load(url)
        .error(R.drawable.error_placeholder_image)
        .into(imageView, new com.squareup.picasso.Callback() {
            @Override
            public void onSuccess() {
                //Success image already loaded into the view
            }
    
            @Override
            public void onError() {
                //Error placeholder image already loaded into the view, do further handling of this situation here
            }
        }
    );
    

    【讨论】:

      【解决方案4】:

      Square 最近更新了 Target 类,现在有更多方法可以覆盖(onPrepareLoad 和 onBitmapFailed):

      Target target = new Target() {
          @Override
          public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
          }
      
          @Override
          public void onBitmapFailed(Drawable errorDrawable) {
      
          }
      
          @Override
          public void onPrepareLoad(Drawable placeHolderDrawable) {
      
          }
      };
      

      而且你仍然必须使用:

      Picasso.with(context).load(url).into(target);
      

      【讨论】:

        【解决方案5】:
         private final Callback mImageCallback = new Callback() {
                @Override
                public void onSuccess() {
                    startPostponedEnterTransition();
                }
        
                @Override
                public void onError() {
                    startPostponedEnterTransition();
                }
            };
        
        RequestCreator creator = Picasso.with(getActivity()).load(list.get(position).getId());
        creator.into(imageView, mImageCallback);
        

        【讨论】:

          【解决方案6】:

          试试这个

                 Picasso.with(context)
                      .load(services.get(position).getImageInactive())
                      .into(holder.icon, new Callback() {
                          @Override
                          public void onSuccess() {
                              holder.imageLoad.setVisibility(View.GONE);
                          }
          
                          @Override
                          public void onError() {
                              holder.icon.setImageResource(R.drawable.ic_error_image_load);
                          }
                      });
          

          【讨论】:

            【解决方案7】:

            作为对其他答案的补充,以防您不知道在哪里使用原始图像视图,例如ImageView myIV:

            原文:

            Picasso.with(activity).load(url).into(myIV);
            

            新的(在new Target() 的onBitmapLoaded() 内):

            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                myIV.setImageBitmap(bitmap);
            }
            

            【讨论】:

              猜你喜欢
              • 2023-03-12
              • 2011-03-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-03-19
              • 1970-01-01
              • 1970-01-01
              • 2021-08-25
              相关资源
              最近更新 更多