在Android中创建回调处理程序以通知多个监听器

9
我有一个Android应用程序,通过供应商提供的库与第三方硬件进行接口。当来自硬件的数据准备好被处理时,该库会回调到我的应用程序。
由于其设计原因,第三方库只向应用程序进行一次回调。然而,当回调被调用时,我的应用程序有几个不同的异步任务需要执行(例如,记录日志、更新UI显示、调用外部程序)。我想办法将事件分散到不同的方法中。所以,我打算在我的Application类中实现这个功能:
interface MyCallback {
    public void doSomething(ArrayList<DataClass>);
}

public class MyApp extends Application {
...
private MyCallback cb; 
public void registerCallback (MyCallback callback) {
    cb = callback;
}

public methodCalledBy3rdPartyAPIOnData (ArrayList<DataClass> data){
    cb.doSomething(ArrayList<DataClass> data);
}

这对于单个方法调用可能有效,但我正在处理如何对一系列回调进行此操作......并确保它们被异步调用的问题。在Android应用程序或Java中一般有没有做这种事情的示例或最佳实践?

1个回答

12

我会使用稍微改编过的观察者模式(改编在于在新线程中通知每个观察者):

你的回调处理程序是主题(即被观察的对象):

public class Subject {
    private List<Observer> observers = new ArrayList<>();

    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    public void notifyObservers(final Object data) {
        for (final Observer observer : observers) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    observer.notify(data);
                }
            }).start();
        }
    }

    public methodCalledBy3rdPartyAPIOnData (ArrayList<DataClass> data){
        notifyObservers((Object)data);
    }
}

每一个实际处理程序都需要实现以下接口

public interface Observer {
    public void notify(Object data);
}

通过调用 subject.registerObserver(this) 来注册自己。


1
观察者模式很好,但你缺少一个unregisterObserver。如果OP的通知类“保持在原地”(比如是单例),而多个观察者可能是活动实例的非静态成员,那么这可能是可取的。为了避免泄漏,例如在超过活动生命周期的单例中保留整个视图堆栈,活动将希望在onPause或类似情况下取消注册监听。 - Tom
@Tom 你说得对,但我只想展示最基本的内容。不过,我应该提一下的。 - Vincent van der Weele
我猜对于unregisterObserver方法,只需要一个简单的observers.remove(observer)就可以了吧?ArrayList中最多只会有5-6个项目,并且希望不经常调用,因此性能不是一个大问题。 - chromicant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接