12

È possibile utilizzare la libreria EventBus come attività relativa alla comunicazione di servizio?Posso utilizzare greenrobot EventBus per la comunicazione tra attività e servizio?

Ho provato questo nella mia app come segue:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    EventBus.getDefault().register(this); 
    setContentView(R.layout.activity_music_player); 
    Intent serviceIntent=new Intent(MusicPlayerActivityTest.this,MusicPlayerServiceTest.class); 
    startService(serviceIntent); 
    EventBus.getDefault().post(new SetSongList(songArraList, 0)); 
} 

@Override 
protected void onDestroy() { 
    EventBus.getDefault().unregister(this); 
    super.onDestroy(); 
} 

e nel mio servizio onEvent chiamato.

+0

hai provato prima di postare qui? –

+0

sì, ho provato. ma ricevo un errore "La classe dell'abbonato non ha metodi pubblici chiamati suEvent" –

+0

beh ... questa è una cosa diversa. Dovresti pubblicare un po 'di codice e logcat in modo che possiamo aiutarti a risolverlo (se possibile) –

risposta

20

È necessario registrare l'Abbonato, non l'emettitore.

Quindi, rimuovere il registro/annullare la registrazione dall'app se si prevede di ottenere l'evento. In tal caso, aggiungi il metodo onEvent (EventEvent Event) alla classe Application.

Quindi registrare EventBus al servizio in onStart() e annullare la registrazione in onStop().

Dovrebbe funzionare meglio allora.

nell'applicazione

public class MyApp extend Application { 
    @Override 
    public void onCreate() { 
    super.onCreate(); 
    ... 
    EventBus.getDefault().post(new SetSongList(songArraList, 0)); 
    } 
} 

o nella vostra attività

public class MyActivity extend Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    EventBus.getDefault().post(new SetSongList(songArraList, 0)); 
    } 
} 

e nel vostro servizio

public class MyService extends Service { 
    ... 
    @Override 
    public void onCreate() { 
    super.onCreate(); 
    EventBus.getDefault().register(this); 
    } 

    @Override 
    public void onDestroy() { 
    EventBus.getDefault().unregister(this); 
    super.onDestroy(); 
    } 

    public void onEvent(SetSongList event){ 
    // do something with event 
    } 
    ... 
} 
+6

Non dovrebbe essere '@Subscribe public void onEvent (evento SetSongList) {'? – behelit

+1

Questo non sembra funzionare in ogni caso, produce il seguente errore: Impossibile inviare l'evento: class someEvent per sottoscrivere la classe di classe someService java.lang.RuntimeException: Impossibile creare il gestore all'interno del thread che non ha chiamato Looper .prepare() – behelit

+0

Questo è per EventBus 2.4, l'API modificata con la nuova versione 3.0. Pubblica il tuo codice in una nuova discussione che posso dare un'occhiata. – Anthony

Problemi correlati