關於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。