Android:在多个实例项中注册回调并将onEvents返回到实例回调的最佳方法是什么?

时间:2017-05-18 15:30:33

标签: android performance callback broadcastreceiver

背景:

  • 没什么特别的,我正在使用Java for Android。

问题:

  • 我想允许我的用户创建一个对象的多个实例,并在每个实例中注册一个回调接口(想想错误回调)。
  • 该对象有几个子/子/等等......每个孩子都可以返回此事件。
  • 我希望在应用程序的整个生命周期中有1-10个实例。
  • 我试图避免使用单例/静态事件监听器。

可能的解决方案(以及不使用它们的原因):

1)在每个父对象实例中注册一个BroadcastReceiver,并允许每个grand child在Intent级别上通知事件。这应该允许主对象通知我的用户有关该事件的信息。 问题是多个实例需要多个BroadcastReceivers,我希望它们很重或只是不太理想。

2)注册一个BroadcastReceiver并找到一种方法让它决定应该通知哪个对象实例,并实际发送给它。问题是我不确定如何通知对象本身。

3)让回调接口作为参数从父级传递给每个子/ grandchilren / etc ......但这会很混乱。

4)使用像EventBus库这样的东西(据我所知,它与BroadcastReceiver相同,只有基于反射,因此速度较慢)。

5)还有别的吗?

1 个答案:

答案 0 :(得分:0)

我不知道这是否是最适合您的解决方案,但我认为如果我能正确理解您的要求,它会起作用。

public class Listener extends Observable implements Observer {

    private List<Observer> clients = new ArrayList<>();

    public void addClient(Observer client){
        clients.add(client);
    }

    @Override
    public void update(Observable o, Object arg) {
        for(Observer client : clients){
            client.update(o, arg); // Or whatever you need to do
        }
    }

    public class DataSource extends Observable {

        private Observer observer;

        public DataSource(Observer o){
            observer = o;
        }

        // Notify observer of changes at appropriate time

    }

    public class Consumer implements Observer {

        public Consumer(){
            Listener listener = ...;
            listener.addClient(this);
        }

        @Override
        public void update(Observable o, Object arg) {
            // Handle appropriately
        }
    }
}

DataSource是您的&#34;子对象&#34;,Consumer是事件的最终客户端,Listener是中间的类。我不知道客户为什么不能直接注册&#34;子对象&#34;但那就是你说的!为简单起见,这里建模为内部类,但我认为你不会这样做。