2017-03-12 1 views
0

Ich habe Probleme mit EventBus 3.0.0 mit dem ich ein einzelnes Ereignis wie diesem Beitrag:EventBus ruft zwei verschiedene Handler für einen einzelnen Beitrag

Call<List<SessionSpec>> call = httpService.getSessionSpecs(); 
call.enqueue(new Callback<List<SessionSpec>>() { 

    @Override 
    public void onResponse(Call<List<SessionSpec>> call, Response<List<SessionSpec>> response) { 
     if (response.isSuccessful()) { 
      List<SessionSpec> specs = response.body(); 
      EventBus.getDefault().post((List<SessionSpec>)specs); 
     } 
     else Log.e(TAG, "sendSessionSpecs(): request NOT successful"); 
    } 

    @Override 
    public void onFailure(Call<List<SessionSpec>> call, Throwable t) { 
     Log.e(TAG, "sendSessionsSpecs(): failed"); 
    } 
}); 

Ich habe zwei Teilnehmer im gleichen Fragment, die jeweils mit unterschiedlichen Signaturen , aber sie sind beide aus einem einzigen Beitrag genannt zu werden:

@Subscribe 
public void onSessionSpec(List<SessionSpec> specs) { 
    Log.d(TAG, "onSessionSpec(): entered"); 
    Log.d(TAG, " : number of session specs: " + specs.size()); 
} 

Der zweite Teilnehmer ist definiert als:

@Subscribe 
public void onOverlayType(List<OverlayType> types) { 
    Log.d(TAG, "onOverlayType(): entered"); 
    Log.d(TAG, " : number of overlay types: " + types.size()); 
} 

Beide Callbacks sind in einem einzigen Fragment, das aktiv ist, wenn der Post fertig ist, und ich habe überprüft, dass der Post nur einmal aufgerufen wird. Wenn das einzelne SessionSpec-Ereignis gepostet wird, werden sowohl die onSessionSpec- als auch die onOverlayType-Callbacks von EventBus mit dem Ereignistyp List> ausgelöst, sodass der onOverlayType-Callback in seinem Callback-Argument den falschen Typ erhält. Die Klasse OverlayType ist eine einfache POJO-Klasse mit 2 Mitgliedern, einem int "sid" und einem String "name". Die Klasse SessionSpec ist komplexer. Es hat einen Member String "name", aber ansonsten ist nichts anderes zwischen diesen 2 Klassen üblich. Ich habe überprüft, dass in der SessionSpec-Klasse nichts dem Begriff "OverlayType" ähnelt.

Die Schnittstellendefinition ist dies:

public interface VcapHttpInterface { 

    @GET("overlay/types") 
    Call<List<OverlayType>> getOverlayTypes(); 

    @GET("session/list") 
    Call<List<SessionSpec>> getSessionSpecs(); 

    @GET("session/{id}") 
    Call<Session> getSession(@Path("id") int sid); 

}

Die getSession Ereignis post/Rückruf keine Probleme hat.

Ich habe den ganzen Tag versucht, herauszufinden, was schief läuft, also bin ich an dieser Stelle ratlos. Weiß jemand, was mit meinem Code falsch ist?

Danke, -Andres

Edit: Wie EventBus wissen, welche Handler für eine bestimmte Reaktion zu nennen? Einige Posts, die ich gelesen habe, sagten, dass EventBus nicht die Handler-Signatur verwendet, aber wie sonst würde es wissen, wie man eine Antwort auf die rechte abonnierte Handler-Routine abbildet? Gibt es eine Möglichkeit, den Handler-Rückruf für ein bestimmtes Ereignis explizit zu definieren?

Antwort

1

EventBus überprüft die Klasse des Objekts, das Sie buchen, und ruft die Methoden auf, die diese Klasse in ihren Parametern erwarten. In Ihrem Fall stellen Sie ein Objekt ein, das eine List ist. In beiden Listener erwarten Sie ein Objekt vom Typ List. Es spielt keine Rolle, welche Generika Sie in OverlayType oder SessionSpec setzen, Eventbus wird beide aufrufen. Um es funktionieren zu lassen, müssen Sie Modelle als Ereignisse definieren.

public class OverlayTypeEvent { 

    public List<OverlayType> types; 

    public OverlayTypeEvent(List<OverlayType> types) { 
     this.types = types; 
    } 
} 

und

public class SessionSpecEvent { 

    public List<SessionSpec> types; 

    public SessionSpecEvent(List<SessionSpec> types) { 
     this.types = types; 
    } 
} 

Und über Einzel auf sie hören. Dann poste Ereignisse mit dem spezifischen Typ.

@Subscribe 
public void onSessionSpec(OverlayTypeEvent event) { 
    List<OverlayType> overlayTypes = event.overlayType; 
} 
+0

das hat es getan. Es macht jetzt alles Sinn. Danke für Ihre Hilfe. –

Verwandte Themen