发布订阅/接收来自IntentService的Otto事件的问题

时间:2013-07-03 04:39:43

标签: android otto

我似乎在这里有两个问题之一。如下错误:

java.lang.IllegalStateException: Event bus [Bus "default"] accessed from non-main thread Looper

或者,如果我设法“解决”这个问题,我根本就不会在我的订阅者中收到该事件。

目前,我有一个班级,从几个来源拼凑,分类巴士:

public class MainThreadBus extends Bus {
    private static Bus _bus;
    private Handler _handler = new Handler(Looper.getMainLooper());

    public MainThreadBus() {
        if (_bus == null) {
            _bus = new Bus();
        }
    }

    @Override public void register(Object obj) {
        _bus.register(obj);
    }

    @Override public void unregister(Object obj) {
        _bus.unregister(obj);
    }

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

在这样的活动中使用了哪个:

@Subscribe
public void requestProgressAvailable(RESTRequestProgress progress) {
    processProgress(progress);
}

@Override
protected void onResume() {
    super.onResume();

    _bus = new MainThreadBus();
    _bus.register(this);
}

@Override
protected void onPause() {
    super.onPause();

    _bus = new MainThreadBus();
    _bus.unregister(this);
}

从这样的IntentService发布:

_bus = new MainThreadBus();
_bus.post(request.createRESTRequestProgress(RESTRequest.STATUS_STARTED));

未收到消息。另一种配置让我收到了线程错误,所以我现在正在使用它。

那么,我错过了什么,或者做错了什么?

编辑:感谢Andy在下面指出我的代码没有按照我的想法行事。上面的代码现在反映了基于该反馈的修改。

2 个答案:

答案 0 :(得分:7)

除了这个实现不是Singleton这个事实,当得到这个错误时,你可以在构造函数中使用threadEnforcer.ANY选项:

private static final Bus BUS = new Bus(ThreadEnforcer.ANY);

答案 1 :(得分:3)

问题是您的代码没有与同一个总线实例交互。您应该访问相同的总线,例如从工厂或通过注射获得的单件,而不是在每种情况下创建新的MainThreadBus。