关于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。