我似乎遇到了两个问题之一。要么是出现以下错误:
java.lang.IllegalStateException: Event bus [Bus "default"] accessed from non-main thread Looper
如果我已经“解决”了这个问题,那么我就不会在我的订阅者中收到事件。
目前,我有一个类,由几个源码拼凑而成,它是 Bus 的子类:
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);
}
});
}
}
}
这是在活动中使用的代码:
Which is used in an Activity like this:
@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指出我的代码并非我所想象的那样。上面的代码现在反映了基于该反馈进行的修改。