9

我有一个 Android 应用程序,它通过供应商提供的库连接 3rd 方硬件。当来自硬件的数据准备好进行处理时,库会回调我的应用程序。

3rd 方库,由于它的设计,只对应用程序进行一次回调。但是,我的应用程序有一些不同的异步任务,它希望在调用回调时执行(例如,记录、更新 UI 显示、调用外部程序)。在某种程度上,试图以不同的方法将事件展开。所以,我正在考虑在我的应用程序类中这样做:

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 中执行此类操作?

4

1 回答 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);
    }
}

而每一个真正的handlers都需要实现如下接口

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

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

于 2013-05-20T14:44:47.093 回答