2017-05-18 9 views
0

背景:Android:複数のインスタンスアイテムにコールバックを登録し、インスタンスコールバックへのonEventsを返す最良の方法は何ですか?

  • 私はAndroid用Javaを使用しています。

問題:

  • 私は、ユーザーがオブジェクトの複数のインスタンスを作成し、(エラーコールバックを考える)各インスタンスにコールバックインタフェースを登録できるようにしたいです。
  • オブジェクトには複数の子/サブクエリ/ etc ...があります。各子はこのイベントを返すことができます。
  • アプリのライフタイム全体で1〜10のインスタンスが必要です。
  • 私は、シングルトン/静的イベントリスナーの使用を避けようとしています。

可能な解決策(およびそれらを使用しないことの理由):

1)各親オブジェクトのインスタンスでBroadcastReceiverを登録し、それぞれの壮大な子供がテントのレベルにイベントを通知することができます。これは、メインオブジェクトがイベントについて私のユーザーに通知できるようにする必要があります。 問題は、複数のインスタンスが複数のBroadcastReceiversを必要とすることです。これは重くなるか、または最適ではないと予想されます。

2)BroadcastReceiverを1つ登録し、イベントの通知を受けるオブジェクトのインスタンスを決定し、実際にそれを送信する方法を見つけます。問題は、オブジェクト自体に通知する方法がわからないことです。

3)コールバックインターフェースをparentからchild/grandchilren/etcの各引数に渡すようにします。しかし、これは面倒です。

4)EventBusライブラリのようなものを使ってください(これはBroadcastReceiverと同じものですが、Reflectionベースのものだから遅くなります)。

5)他に何かありますか?

+0

私はあなたがしていることについて完全に明確ではありませんが、Observer/Observableについてはどうですか? – nasch

+0

私はObsrの下にあります。パターンは、1つのオブジェクトを聴いているm個のオブジェクトに使用されます。複数のサブオブジェクトからイベントを識別し、複数のリスナーオブジェクトのいずれかに通知するために、1つのオブジェクトが必要です。 –

答えて

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 
     } 
    } 
} 

DataSourceConsumerイベントのエンドクライアントで、Listenerは途中でクラスである、あなたの「サブオブジェクト」です。クライアントが「サブオブジェクト」を使ってイベントに直接登録できない理由はわかりませんが、それはあなたが言ったことです!これは単純化のために内部クラスとしてモデル化されていますが、私はそれをしないと仮定します。

関連する問題