2016-02-28 41 views
1

我刚刚迁移到Fresco库用于在我的应用程序中加载图像。壁画图像加载回调

我需要听图像加载事件,我当然在文件Listening to download events

阅读这篇文章,这正是我需要的,但是.... 有几件事情,我不喜欢。

我的目标是隐藏View如果它不能从网上下载它。

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

  2. 每次我需要加载图像时,我需要使用Builder创建控制器对象,并且在将这种方法与包含图像的很多项目列表结合使用时,会导致性能问题。

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

我需要能够有从控制器参考SimpleDraweeView,并在MVC模式的方法,如果控制器知道有关的观点似乎不错。

请建议最好的方法来丰富我的目标。

谢谢。

回答

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引用引用Drawable的DraweeHierarchy,顶层drawable为了传播Drawable.Callback事件而对父视图有一个WeakReference。但就是这样。 DraweeController不需要视图,我们不能/不会继续引用视图。原因是DraweeControllers和DraweeHierarchies可以在View以外的环境中使用,并且控制器不需要对视图进行反向引用。 DraweeController控制DraweeHierarchy,而不是视图。

关于2,虽然楼宇控制器,您可以指定setOldController(view.getController())。这样,您正在更换的旧控制器将在构建新控制器时重复使用。这可以节省分配并且有助于scroll-perf。

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