如何使用Otto事件总线将事件从Service发送到Activity?

时间:2013-03-15 11:53:31

标签: android otto

简单BusProvider.getInstance().post()带来的异常不是main thread。 如何使用Otto事件总线将事件从Service发送到Activity?

7 个答案:

答案 0 :(得分:120)

要从任何线程(主要或背景)发布并在主线程上接收,请尝试类似

的内容
public class MainThreadBus extends Bus {
  private final Handler mHandler = new Handler(Looper.getMainLooper());

  @Override
  public void post(final Object event) {
    if (Looper.myLooper() == Looper.getMainLooper()) {
      super.post(event);
    } else {
      mHandler.post(new Runnable() {
        @Override
        public void run() {
          MainThreadBus.super.post(event);
        }
      });
    }
  }
}

注意:对于一般方法,Jerry Wharton和https://github.com/square/otto/issues/38的“pommedeterresaute”是有用的。我只是用包装类而不是子类实现它。

答案 1 :(得分:20)

要从任何线程(主要或背景)发布并在主线程上接收,请使用以下MainThreadBus而不是香草Bus

public class MainThreadBus extends Bus {
     private final Handler handler = new Handler(Looper.getMainLooper());

     @Override public void post(final Object event) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            super.post(event);
        } else {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    MainThreadBus.super.post(event);
                }
            });
        }
    }
}

这是基于Andy Dennie的回答。

不需要扩展和包装Bus对象,做一个或另一个。在Dennie的答案中,它实际上是一个包装器,Bus基类只是像接口一样被使用,所有功能都被覆盖。

即使您删除Bus基类,除非您碰巧通过MainThreadBus引用引用了Bus,否则它会正常工作。

答案 2 :(得分:3)

如果您确定要从非主要帖子发帖,请执行此操作:

new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        mBus.post(new myEvent());
                    }
                });

正如俗话所说,"保持简单和愚蠢" :)

答案 3 :(得分:2)

bus = new Bus(ThreadEnforcer.ANY);是这个问题的明确解决方案。 这就是你所要做的一切。

答案 4 :(得分:0)

最适合我的实施定制公交课程

public class AndroidBus extends Bus {
    private final Handler mainThread = new Handler(Looper.getMainLooper());

    @Override
    public void post(final Object event) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            super.post(event);
        } else {
            mainThread.post(() -> AndroidBus.super.post(event));
        }
    }
}

答案 5 :(得分:0)

我做得很简单:

Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                bus.post(event);
            }

        });

快乐编码.. :)

答案 6 :(得分:-1)

只需使用BasicBus创建ThreadEnforcer.NONE即可从非主线程发布事件。提到的ThreadEnforcer.MAIN恰好相反(和默认值),它只接受来自主线程的帖子。