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」 –

+0

以及...這是一個不同的事情。您應該發佈一些代碼和logcat,以便我們可以幫助您解決它(如果可能) –

回答

20

您必須註冊訂戶,而不是發射器。

因此,如果您希望獲得該活動,請從您的應用中刪除註冊/取消註冊。如果是這樣,只需將onEvent(AnyEvent事件)方法添加到Application類。

然後在onStart()的服務中註冊EventBus並在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

這似乎不起作用,它會產生以下錯誤: 無法調度事件:class someEvent訂閱類的類someService java.lang.RuntimeException:無法在未調用Looper的線程內創建處理程序.prepare() – behelit

+0

這是用於EventBus 2.4,API隨新版本3.0更改。將您的代碼發佈到一個新線程中,我可以看看。 – Anthony

相關問題