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



背景:

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

问题:

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

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

1) 在每个父对象实例中注册一个 BroadcastReceiver,并允许每个孙子在意图级别通知事件。这应该允许主对象通知我的用户有关事件的信息。 问题是多个实例需要多个广播接收器,我预计这些接收器会很重或不是最佳值。

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

3)让回调接口作为参数从父级传递给每个子项/孙子/等等...但这将是混乱的。

4)使用类似EventBus库的东西(我理解它与BroadcastReceiver相同,仅基于反射,因此速度较慢)。

5)还有什么事吗?

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

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是你的"子对象",Consumer是事件的最终客户端,Listener是中间的类。我不知道为什么客户端不能直接注册带有"子对象"的事件,但这就是你说的!为了简单起见,这里将其建模为内部类,但我认为您不会这样做。

最新更新