2016-02-28 72 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);