Android 壁画图像加载回调
我刚刚迁移到Android 壁画图像加载回调,android,performance,callback,android-image,fresco,Android,Performance,Callback,Android Image,Fresco,我刚刚迁移到Fresco库,以便在我的应用程序中加载图像 我需要听图像加载事件,当然我在文档中阅读了这篇文章 这正是我需要的,但是。。。。 有几件事我不喜欢 我的目标是隐藏视图,如果它无法从网上下载 我无法从控制器引用SimpleDraweView,即使是在回调方法上。我需要隐藏视图,但似乎无法获取对它的引用 每次需要加载图像时,我都需要使用Builder创建控制器的对象,这可能会导致在使用此方法处理包含图像的大量项目列表时出现性能问题 holder.simpledraweviewimage.s
Fresco
库,以便在我的应用程序中加载图像
我需要听图像加载事件,当然我在文档中阅读了这篇文章
这正是我需要的,但是。。。。
有几件事我不喜欢
我的目标是隐藏视图
,如果它无法从网上下载
SimpleDraweView
,即使是在回调方法上。我需要隐藏视图
,但似乎无法获取对它的引用Builder
创建控制器的对象,这可能会导致在使用此方法处理包含图像的大量项目列表时出现性能问题holder.simpledraweviewimage.setController(Fresco.newDraineControllerBuilder()
.setControllerListener(controllerListener)
.setUri(currentItem.getImage())
.build())代码>
我需要能够从控制器中引用SimpleDraweeView
,并且在MVC
模式方法中,如果控制器知道视图,则似乎没有问题
请建议实现我目标的最佳方式
谢谢。关于1,也许您可以这样做:
class ControllerListenerWithView() extends BaseControllerListener {
private final WeakReference<View> mViewReference;
ControllerListenerWithView(View view) {
mViewReference = new WeakReference<>(view);
}
@Nullable
protected View getView() {
return mViewReference.get();
}
}
如果在侦听器创建时无法访问视图,则可以添加setter方法并执行以下操作,而不是通过侦听器构造函数传递视图:
controllerListener.setView(holder.simpleDraweeViewImage);
controller = ...
holder.simpleDraweeViewImage.setController(controller);
如果你觉得这很难看,那是因为它很难看:)包含循环引用的设计很难看。抽屉控制器没有对视图的引用(至少不是直接引用)。DraweeControl引用一个Drawables的DraweeHierarchy,顶级Drawables对父视图有一个WeakReference,以便传播drawable.Callback事件。但就是这样。抽屉控制器不需要视图,我们不能/不会在其中保留对视图的引用。这样做的原因是,抽屉控制器和抽屉层次结构可以在视图以外的上下文中使用,并且控制器不需要对视图进行反向引用。抽屉控制器控制抽屉层次结构,而不是视图
关于2,在构建控制器时,可以指定setOldController(view.getController())
。这样,您要更换的旧控制器将在构建新控制器时重新使用。这将保存分配并帮助滚动性能。可以在失败时隐藏方法:
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);
ControllerListener listener=new BaseControllerListener(){
@凌驾
public void onFinalImageSet(字符串id,@null-ImageInfo-ImageInfo,@null-Animatable-Animatable){
//对最终图像加载的操作
}
@凌驾
public void onFailure(字符串id,Throwable-Throwable){
//对失败采取行动
}
};
DraineController控制器=Fresco.newDraineControllerBuilder()
.setUri(uri)
.setControllerListener(侦听器)
.build();
付款人查看设置控制器(控制器);
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);