2016-01-22 61 views
0

我正在使用第三方庫異步加載圖像數據。 我將偵聽器傳遞給該方法,並在加載\下載完成時將一個事件傳遞給我的偵聽器,然後我開始使用它。例如:傳遞偵聽器事件要調用的不同方法列表

getMainDownloader.getImagesLoader().loadImages(new IListener() { 


         @Override 
         public void loadingCompleted() { 

         //calling methods that uses this asset 
         method1(); 
         method2(); 

         } 
        }, ImagesList.get(0), ImagesList.get(3),ImagesList.get(5)); 

監聽接口:

public static interface IListener { 
    public void loadingCompleted(); 

} 

在我的代碼,我有很多的,我應該下載這些資產之上,並調用不同的方法的地方 - method5(),method12() ...上loadingCompleted() ,所以我複製上面的代碼,每次更改創建重複代碼的方法。

是否有技術來設置加載這些資產的一種方法,以及一些如何傳遞方法(method1()...)我想在loadingCompleted()中調用?

+0

嘗試java8和方法的引用 – koem

回答

0

而不是使用匿名類的,你可以使用一個「真實」或嵌套類:

private static class MultiImagesListener implements IListener() { 
    private final String imageId; 
    public MultiImagesListener (String imageId) { 
     this.imageId = imageId; 
    } 

    @Override 
    public void loadingCompleted() { 
     // use this.imageId to decide which methods to call... 
     if (IMG_ID1.equals(imageId)) { 
      method1(); 
      method13(); 
      method27(); 
     // ... 
    } 
} 

你通過監聽到loadImages - 方法的一個實例每次,你應該通過不同的參數爲了構造區分偵聽器實例:

getMainDownloader.getImagesLoader().loadImages(new MultiImagesListener(IMG_ID1); 
getMainDownloader.getImagesLoader().loadImages(new MultiImagesListener(IMG_ID2); 
+0

它是一種很好的方法,如果所有的方法都是一樣的,但有些方法會使用不能在類中聲明的參數範圍,th被轉移到。這也會創建一個if-else語句的方法......我想要更通用的東西 – RonTr

+0

如果你有一個嵌套的(非靜態的)類,你可以從周圍的類實例中訪問變量。所以應該沒有必要提前將它們傳送給IListener。 由於'loadingCompleted'沒有參數,IMO必須通過在監聽器的構造時傳遞一些信息來區分監聽器調用。除了這個簡單的「字符串方法」,你可以使用枚舉/開關或者如果對象可以區分,你可以使用訪問者模式。 – MrD