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

Mec*_*cid 58 android otto

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

And*_*nie 121

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

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);
        }
      });
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:对于一般方法,可以通过https://github.com/square/otto/issues/38获取Jake Wharton和"pommedeterresaute" .我只是用包装类而不是子类实现它.

  • 谢谢.那么截至目前,**总线bus2 =新总线(ThreadEnforcer.MAIN);**解决它? (3认同)
  • 对我来说,'ThreadEnforcer.MAIN`没有解决它,但这里提供的代码. (3认同)
  • 为什么使用包装器和子类?很混乱. (2认同)

ale*_*ett 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);
                }
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是基于Andy Dennie的回答.

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

即使您删除了Bus基类,它也会起作用,除非您碰巧引用MainThreadBusBus引用.