【问题标题】:Fresco image loading callbackFresco 图片加载回调
【发布时间】:2016-02-28 11:41:12
【问题描述】:

我刚刚迁移到 Fresco 库以在我的应用程序中加载图像。

我需要听Image Loading Events,当然我在文档Listening to download events阅读了这篇文章

这正是我需要的,但是...... 我不喜欢的东西很少。

如果无法从网上下载View,我的目标是隐藏它。

  1. 我无法从控制器引用SimpleDraweeView,即使在回调方法中也是如此。我需要隐藏View,但我似乎无法得到它的参考。

  2. 每次我需要加载图像时,我都需要使用Builder 创建控制器对象,当使用这种方法处理大量带有图像的项目时,这可能会导致性能问题。

holder.simpleDraweeViewImage.setController(Fresco.newDraweeControllerBuilder() .setControllerListener(controllerListener) .setUri(currentItem.getImage()) .build());

我需要能够从控制器中引用SimpleDraweeView,并且在MVC 模式方法中,如果控制器知道视图似乎没问题。

请提出实现我目标的最佳方法。

谢谢。

【问题讨论】:

    标签: android performance callback android-image fresco


    【解决方案1】:

    可以隐藏 onFailure 方法:

    ControllerListener listener = new BaseControllerListener<ImageInfo>() {
    
                    @Override
                    public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable animatable) {
                       //Action on final image load
                    }
                    @Override
                    public void onFailure(String id, Throwable throwable) {
                        //Action on failure
                    }
    
                };
                DraweeController controller = Fresco.newDraweeControllerBuilder()
                        .setUri(uri)
                        .setControllerListener(listener)
                        .build();
                draweeView.setController(controller);
    

    【讨论】:

      【解决方案2】:

      关于1,也许你可以这样做:

      class ControllerListenerWithView() extends BaseControllerListener {
         private final WeakReference<View> mViewReference;
      
         ControllerListenerWithView(View view) {
           mViewReference = new WeakReference<>(view);
         }
      
         @Nullable
         protected View getView() {
           return mViewReference.get();
         }
      }
      

      然后:

      ControllerListener controllerListener = new ControllerListenerWithView(holder.simpleDraweeViewImage) {
        @Override
        public void onFailure(String id, Throwable throwable) {
          View view = getView();
          if (view != null) {
            view.setVisibility(View.GONE);
          }
        }
      };
      

      如果您在创建侦听器时无法访问视图,则可以添加一个 setter 方法并执行以下操作,而不是通过侦听器构造函数传递视图:

      controllerListener.setView(holder.simpleDraweeViewImage);
      controller = ...
      holder.simpleDraweeViewImage.setController(controller);
      

      如果这对你来说看起来很丑,那是因为它很丑:) 涉及循环引用的设计很丑。 DraweeController 没有对视图的引用(至少没有直接引用)。 DraweeController 引用了一个 DraweeHierarchy ,该 DraweeHierarchy 引用了 Drawables 并且顶层 drawable 有一个到父视图的 WeakReference 以传播 Drawable.Callback 事件。但就是这样。 DraweeController 不需要视图,我们不能/不会保留对其中视图的引用。原因是 DraweeControllers 和 DraweeHierarchies 可以在 View 以外的上下文中使用,并且控制器没有必要对视图进行反向引用。 DraweeController 控制 DraweeHierarchy,而不是视图。

      关于2,在构建控制器时,可以指定setOldController(view.getController())。这样,您要更换的旧控制器将在构建新控制器时被重用。这节省了分配并有助于滚动性能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-27
        • 2012-06-03
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多