首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >机器人中绿色机器人EventBus post事件

机器人中绿色机器人EventBus post事件
EN

Stack Overflow用户
提问于 2013-01-10 16:57:46
回答 4查看 18.1K关注 0票数 7

通过使用EventBus,我需要在一个活动中发布一个事件(MyEvent),并在另一个活动中接收该事件。我尝试了绿色机器人的EventBus性能测试项目,但无法得到如何做。

我试过在ActivitySubscriber

代码语言:javascript
复制
MyEvent event = new MyEvent();
EventBus.getDefault().post(event);

并试图在ActivityReceiver中将事件接收为

代码语言:javascript
复制
EventBus.getDefault().register(this);

public void onEvent(MyEvent event){
....
}

但我无法接受这一事件。有人能告诉我我哪里做错了吗?

EN

回答 4

Stack Overflow用户

发布于 2013-02-04 06:18:44

因为它们是两个活动,所以ActivitySubscriberActivityReceiver仍未创建或处于停滞模式(onStop())时发布事件。您需要使用粘性事件,即

  • ActivitySubscriber.postSticky(...)

对于ActivityReceiver,您有两个选项:

  • EventBus.getDefault().register(this)和之后的某个地方-- EventBus.getDefault().getStickyEvent()
  • EventBus.getDefault().registerSticky(),然后使用常规EventBus.getDefault().onEvent(...)

更新: EventBus 3.0改变订阅方式。

不需要以特定后缀结尾的方法名称,而需要注释。

如何使用版本3:

代码语言:javascript
复制
//// 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版的更多细节和比较:

  • http://androiddevblog.com/eventbus-3-droidcon/
  • http://androiddevblog.com/wordpress/wp-content/uploads/EventBus3.pdf

从消息来源中摘录的一些细节:

  • 将在同一线程中调用ThreadMode.PostThread订阅服务器,该线程将发布事件。这是默认的。事件传递意味着开销最小,因为它完全避免了线程切换。因此,对于已知完成的简单任务来说,这是推荐的模式,这是一个很短的时间,而不需要主线程。使用此模式的事件处理程序必须快速返回,以避免阻塞可能是主线程的must线程。

  • ThreadMode.MainThread订阅者将在Android的主线程(有时称为UI线程)中调用。如果投递线程是主线程,则将直接调用事件处理程序方法。使用此模式的事件处理程序必须快速返回,以避免阻塞主线程。

  • 将在后台线程中调用ThreadMode.BackgroundThread订阅服务器。如果posting线程不是主线程,则事件处理程序方法将直接在投递线程中调用。如果投递线程是主线程,则EventBus使用单个后台线程,该线程将依次交付其所有事件。使用此模式的事件处理程序应尝试快速返回,以避免阻塞后台线程。

  • ThreadMode.Async事件处理程序方法在单独的线程中调用。这始终独立于投递线程和主线程。投递事件从不等待使用此模式的事件处理程序方法。如果事件处理程序方法的执行可能需要一段时间,例如用于网络访问,则应使用此模式。避免同时触发大量长时间运行的异步处理程序方法,以限制并发线程的数量。EventBus使用线程池有效地重用已完成的异步事件处理程序通知中的线程。

  • 默认值用于@Subscribe
    • threadMode = ThreadMode.PostThread
    • sticky = false -如果为真,则传递最新的粘性事件(与de.greenrobot.event.EventBus.postSticky(Object)一起发布到此订阅服务器)(如果事件可用)
    • priority = 0 -订阅者优先级影响事件传递的顺序。在同一传递线程中,较高优先级的订阅者将在其他优先级较低的用户之前接收事件。默认优先级为0。注意:优先级不影响具有不同线程模式的订阅服务器之间的传递顺序。

编辑2

现在有一个专门的站点,用于解答库创建者的任何绿色机器人EventBus问题:

http://greenrobot.org/eventbus/

票数 24
EN

Stack Overflow用户

发布于 2016-11-25 23:56:09

  1. 添加

dependencies { .. compile 'org.greenrobot:eventbus:3.0.0' .. }

进入模块构建级的依赖部分

  1. 创建一个MessageEvent类,如

代码语言:javascript
复制
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

  1. 假设我们有Fragment1,并且有一个按钮应该向MainActivity发送消息

代码语言:javascript
复制
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;
    }

  1. 最后结束MainActivity听录音和做动作

代码语言:javascript
复制
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();
    }
}

票数 3
EN

Stack Overflow用户

发布于 2014-08-20 09:52:32

在ActivityReceiver类中,替换

代码语言:javascript
复制
EventBus.getDefault().register(this); 

使用

代码语言:javascript
复制
EventBus.getDefault().register(this, MyEvent.class);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14263183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档