12

サービス通信に関して、EventBusライブラリをアクティビティとして使用できますか?アクティビティとサービスの通信にgreenrobot EventBusを使用できますか?

次のように私は私のアプリでこれを試してみました:

@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(); 
} 

と私のサービスにonEventと呼ばれます。

+0

あなたがしようとしましたここに投稿する前に? –

+0

はい私は試みた。しかし、「サブスクライバクラスにはonEventというpublicメソッドはありません」というエラーが表示されています。 –

+0

これは別のものです。あなたはそれを修正するために(可能であれば) –

答えて

20

エミッタではなくサブスクライバを登録する必要があります。

イベントを取得する予定がある場合は、アプリから登録/登録解除を削除してください。その場合は、onEvent(AnyEventイベント)メソッドをApplicationクラスに追加するだけです。

サービスのEventBusをonStart()に登録し、onStop()を登録解除してください。

これはうまくいくはずです。

アプリケーション内の

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

またはあなたの活動に

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

し、あなたのサービスで

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

'@Subscribe public void onEvent(SetSongList event){'? – behelit

+1

これは、次のエラー生成し、とにかく動作していないよう:クラスクラスsomeService java.lang.RuntimeExceptionをサブスクライブするクラスsomeEvent: がイベントをディスパッチできませんでしたルーパーと呼ばれていないスレッド内のハンドラを作成できません.prepare() – behelit

+0

これはEventBus 2.4用で、APIは新しいバージョン3.0で変更されました。私は一見することができる新しいスレッドであなたのコードを投稿してください。 – Anthony

関連する問題