2013-05-20 5 views
6

ベンダ提供のライブラリを介してサードパーティのハードウェアを接続するAndroidアプリケーションがあります。ハードウェアからのデータが処理可能な状態になると、ライブラリはアプリケーションにコールバックします。Androidで複数のコールバックを処理するためのコールバックハンドラを作成する

サードパーティのライブラリは、設計上、アプリケーションに対して1つのコールバックしか作成しません。しかし、私のアプリケーションには、コールバックが呼び出されたとき(例えば、ロギング、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); 
} 

が、私は、コールバックのシリーズのためにこれを行う方法の問題を抱えている..:だから、私は私のApplicationクラスでこれを行うことを考えていますそれらが非同期に呼び出されるようにします。 Androidアプリケーションや一般的なJavaでこのようなことをするための例やベストプラクティスはありますか?

答えて

8

私は少し(適応は新しいスレッドで各観測者に通知される)Observer Patternを適応使用します。

あなたのコールバックハンドラは(すなわち、観察されている)の対象である:

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

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

    public void notifyObservers(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)を呼び出すことによって、自分自身を登録する必要があります。

+0

Observerは良好ですが、unregisterObserverがありません。 OPの通知クラスが「滞在する」(例えば、シングルトン)と、複数のオブザーバがアクティビティのインスタンスの非静的メンバーである場合、これは望ましい場合があります。アクティビティーの存続期間を超えるシングルトン内にビュー全体を保持するなど、漏洩を避けるために、アクティビティーはlisten onPauseなどの登録を解除する必要があります。 – Tom

+0

@Tomあなたは正しいですが、私は裸を最小限に抑えたいと思っていました。しかし、それを言及している必要があります。 –

+0

これは正しいオプションだと思います。 – Tom

関連する問題