【问题标题】:Can I use greenrobot EventBus for Communication between Activity and Service?我可以使用 greenrobot EventBus 在 Activity 和 Service 之间进行通信吗?
【发布时间】:2015-09-28 19:49:53
【问题描述】:

EventBus我可以使用这个库进行 Activity 到服务的通信吗?

我在我的应用程序中尝试过如下:

@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 中调用

【问题讨论】:

  • 发帖前你试过了吗?
  • 是的,我试过了。但我收到一条错误消息:“订阅者类没有名为 onEvent 的公共方法”
  • 嗯……那是另一回事。您应该发布一些代码和 logcat,以便我们可以帮助您修复它(如果可能)
  • 你能解释一下如何使用它吗?
  • “我收到一条错误消息,提示“订阅者类没有名为 onEvent 的公共方法”——我们无法帮助您处理订阅者,除非您为订阅者发布代码。一般来说,是的,您可以使用greenrobot 的EventBus 从服务到活动进行通信(反之亦然)。有关示例,请参见 github.com/commonsguy/cw-omnibus/tree/master/EventBus/…。

标签: android android-activity android-service greenrobot-eventbus


【解决方案1】:

您必须注册订阅者,而不是发射者。

因此,如果您确实希望收到该事件,请从您的应用中删除注册/取消注册。如果是这样,只需将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
  }
  ...
}

【讨论】:

  • 不应该是@Subscribe public void onEvent(SetSongList event){吗?
  • 这似乎不起作用,它会产生以下错误:无法调度事件:类 someEvent 到订阅类类 someService java.lang.RuntimeException:无法在线程内创建处理程序不叫 Looper.prepare()
  • 这是针对 EventBus 2.4 的,API 随新版本 3.0 更改。将您的代码发布到我可以查看的新线程中。
  • 如果我想反之通信怎么办?从服务到活动?我该怎么做?
  • Activity -> 服务事件流只有在服务在同一个进程中运行时才会起作用。
【解决方案2】:

zyamys 对我的评论很有帮助。此外,由于代码错误,Anthony 的回答是正确的。

如果您使用不同的流程,答案是NO。如果您使用不同的进程,则意味着它在不同的虚拟机(如 Davlik)上运行。所有静态字段都不一样...! 示例(AndroidManifest.xml):

<service android:name=".GPSTracker" android:process=":my_gps_tracker" />

如果您在同一进程中运行服务,则答案为 YES。示例(AndroidManifest.xml):

<service android:name=".GPSTracker"/>

在第一种情况下,我建议结合使用 Intent 和发送/接收广播功能在服务和活动之间发送数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    相关资源
    最近更新 更多