2016-01-22 58 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