Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 壁画图像加载回调_Android_Performance_Callback_Android Image_Fresco - Fatal编程技术网

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