通过使用EventBus,我需要在一个活动中发布一个事件(MyEvent),并在另一个活动中接收该事件。我尝试了绿色机器人的EventBus性能测试项目,但无法得到如何做。
我试过在ActivitySubscriber
MyEvent event = new MyEvent();
EventBus.getDefault().post(event);并试图在ActivityReceiver中将事件接收为
EventBus.getDefault().register(this);
public void onEvent(MyEvent event){
....
}但我无法接受这一事件。有人能告诉我我哪里做错了吗?
发布于 2013-02-04 06:18:44
因为它们是两个活动,所以ActivitySubscriber在ActivityReceiver仍未创建或处于停滞模式(onStop())时发布事件。您需要使用粘性事件,即
ActivitySubscriber.postSticky(...)对于ActivityReceiver,您有两个选项:
EventBus.getDefault().register(this)和之后的某个地方-- EventBus.getDefault().getStickyEvent()EventBus.getDefault().registerSticky(),然后使用常规EventBus.getDefault().onEvent(...)更新: EventBus 3.0改变订阅方式。
不需要以特定后缀结尾的方法名称,而需要注释。
如何使用版本3:
//// in your build.gradle
compile 'de.greenrobot:eventbus:3.0.0-beta1'
// alternatively you can target latest whatever currently
// compile 'de.greenrobot:eventbus:+'
//// from a class which needs to dispatch an event
// posting an event is as before, no changes
// here we dispatch a sticky event
EventBus.getDefault().postSticky(myStickyEvent);
//// from your class which needs to listen
// method name can be any name
// any of subscribe params is optional, i.e. can use just @Subscribe
@Subscribe(threadMode = ThreadMode.MainThread, sticky = true, priority = 1)
public void onEventBusEvent(@Nullable final StickyEvent stickyEvent) {
if (stickyEvent != null) {
...
// optionally you can clean your sticky event in different ways
EventBus.getDefault().removeAllStickyEvents();
// EventBus.getDefault().removeStickyEvent(stickyEvent);
// EventBus.getDefault().removeStickyEvent(StickyEvent.class);
}
}有关第3版的更多细节和比较:
从消息来源中摘录的一些细节:
ThreadMode.PostThread订阅服务器,该线程将发布事件。这是默认的。事件传递意味着开销最小,因为它完全避免了线程切换。因此,对于已知完成的简单任务来说,这是推荐的模式,这是一个很短的时间,而不需要主线程。使用此模式的事件处理程序必须快速返回,以避免阻塞可能是主线程的must线程。ThreadMode.MainThread订阅者将在Android的主线程(有时称为UI线程)中调用。如果投递线程是主线程,则将直接调用事件处理程序方法。使用此模式的事件处理程序必须快速返回,以避免阻塞主线程。ThreadMode.BackgroundThread订阅服务器。如果posting线程不是主线程,则事件处理程序方法将直接在投递线程中调用。如果投递线程是主线程,则EventBus使用单个后台线程,该线程将依次交付其所有事件。使用此模式的事件处理程序应尝试快速返回,以避免阻塞后台线程。ThreadMode.Async事件处理程序方法在单独的线程中调用。这始终独立于投递线程和主线程。投递事件从不等待使用此模式的事件处理程序方法。如果事件处理程序方法的执行可能需要一段时间,例如用于网络访问,则应使用此模式。避免同时触发大量长时间运行的异步处理程序方法,以限制并发线程的数量。EventBus使用线程池有效地重用已完成的异步事件处理程序通知中的线程。@Subscribe threadMode = ThreadMode.PostThreadsticky = false -如果为真,则传递最新的粘性事件(与de.greenrobot.event.EventBus.postSticky(Object)一起发布到此订阅服务器)(如果事件可用)priority = 0 -订阅者优先级影响事件传递的顺序。在同一传递线程中,较高优先级的订阅者将在其他优先级较低的用户之前接收事件。默认优先级为0。注意:优先级不影响具有不同线程模式的订阅服务器之间的传递顺序。
编辑2
现在有一个专门的站点,用于解答库创建者的任何绿色机器人EventBus问题:
http://greenrobot.org/eventbus/
发布于 2016-11-25 23:56:09
dependencies { .. compile 'org.greenrobot:eventbus:3.0.0' .. }
进入模块构建级的依赖部分
public final class MessageEvent {
private MessageEvent() {
throw new UnsupportedOperationException("This class is non-instantiable");
}
public static class Message1{
public String str1;
public Message1(String str) {
str1 = str;
}
}
public static class Message2{
public String str2;
public Message2(final String str) {
str2 = str;
}
}
}
// so on
public class Fragment1 extends Fragment {
private View frView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup
container, Bundle savedInstanceState) {
frView = inflater.inflate(R.layout.fragment1,
container, false);
btn = (Button) frView.findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
frView.setBackgroundColor(Color.RED);
EventBus.getDefault().post(new MessageEvent.Message1("1st message"));
EventBus.getDefault().post(new MessageEvent.Message2("2nd message"));
}
});
return frView;
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
protected void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment1 Fragment1 = new Fragment1();
getFragmentManager().beginTransaction().replace(
R.id.activity_main, Fragment1,
"Fragment 1").commit();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage1(MessageEvent.Message1 event) {
Toast.makeText(getApplication(), event.str1,
Toast.LENGTH_LONG).show();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage2(MessageEvent.Message2 event) {
Toast.makeText(getApplication(), event.str2,
Toast.LENGTH_LONG).show();
}
}
发布于 2014-08-20 09:52:32
在ActivityReceiver类中,替换
EventBus.getDefault().register(this); 使用
EventBus.getDefault().register(this, MyEvent.class);https://stackoverflow.com/questions/14263183
复制相似问题