2016-06-15 6 views
1

Ottoでは、@Subscribeアノテーションを使用せずにイベントを購読することは可能ですか?イベントのためのオットーイベントバスランタイムサブスクリプション

私の使用例では、私のオブジェクトがコンパイル時にサブスクライブすべきイベントがわかりません。実行時に特定のルールに基づいて実行したいと考えています。

+0

おそらく別のオブジェクトタイプを使用してください –

+0

それはできません。 https://github.com/square/otto/blob/a85ae721d337d9129eb49f5dc90c8e65d49d48ca/otto/src/main/java/com/squareup/otto/AnnotatedHandlerFinder.java#L72 – Ozgur

+0

@SimonMarquisあなたは説明できますか? –

答えて

2

私は非常にクリーンなソリューションです別の回避策は、

public class MainClass {  

    private EventObserver eventObserver; 

    public MainClass() { 
     if(...someCondition...) { 
      eventObserver = new FirstEventObserver(); 
     } else { 
      eventObserver = new SecondEventObserver(); 
     } 
    } 

    public onEvent(Event event) { 
     if (event instanceOf FirstEvent) { 
      ... handle event ... 
     } else if (event instanceOf SecondEvent) { 
      ... handle event ... 
     } 
    } 
} 

public abstract class EventObserver { 

    protected MainClass mainClass; 

    public void setMainClass(MainClass mainClass) { 
     this.mainClass = mainClass; 
    } 

    protected void notifyMainClass(Event event) { 
     if (mainClass != null) { 
      mainClass.onEvent(event); 
     } 
    } 
} 

public class FirstEventObserver extends EventObserver { 

    public FirstEventObserver() { 
     bus.subscribe(this); 
    } 

    @Subscribe 
    public void onEvent(FirstEvent event) { 
     notifyMainClass(); 
    } 
} 


public class SecondEventObserver extends EventObserver { 

    public SecondEventObserver() { 
     bus.subscribe(this); 
    } 

    @Subscribe 
    public void onEvent(SecondEvent event) { 
     notifyMainClass(); 
    } 
} 

public abstract class Event { 
} 

public abstract class FirstEvent extends Event { 
} 

public abstract class SecondEvent extends Event { 
} 

、あなたはこのように回避策を使用することができたとします。実行時に目的のタイプでイベントを生成することができます。

public class MainClass { 
    @Subscribe 
    public void onEvent(Event event) { 
     if (event.getType() == EventType.FIRST_EVENT) { 
      ... handle event ... 
     } else if (event.getType() == EventType.SECOND_EVENT) { 
      ... handle event ... 
     } 
    } 
} 

public class Event { 
    public enum EventType { 
     FIRST_EVENT, 
     SECOND_EVENT 
    } 

    private EventType eventType; 

    public Event(EventType eventType) { 
     this.eventType = eventType; 
    } 

    public EventType getType() { 
     return eventType; 
    } 
} 
0

私は、実行時にOttoでイベントを購読するためのフレームワークを作成しました。異なるイベントタイプに対して異なるModelクラスを持つ代わりに、異なるイベントに対して異なるEventDelegateを持つことができます。これらのイベントデリゲートはイベントを受信して​​サブスクライバクラスに渡します。 典型的なEventDelegateは、このアプローチはin this article説明されている。この

public abstract class OttoEventDelegate { 
private OttoEventListener ottoEventListener; 

public OttoEventDelegate(OttoEventListener ottoEventListener) { 
    this.ottoEventListener = ottoEventListener; 
} 

public void register() { 
    BaseApplication.getInstance().getBus().register(this); 
} 

public void unregister() { 
    BaseApplication.getInstance().getBus().unregister(this); 
} 

public OttoEventListener getOttoEventListener() { 
    return ottoEventListener; 
} 

public void setOttoEventListener(OttoEventListener ottoEventListener) { 
    this.ottoEventListener = ottoEventListener; 
} 
} 

のようになります。また、実装を見たい場合。その上github here

関連する問題