我好像在这里遇到两个问题之一.要么像以下错误:
java.lang.IllegalStateException: Event bus [Bus "default"] accessed from non-main thread Looper
Run Code Online (Sandbox Code Playgroud)
或者,如果我设法"解决"那个问题,我根本就不会在订阅者中收到该事件.
目前,我有一个类,从几个来源拼凑,分类巴士:
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);
}
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这样的Activity中使用哪个:
@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);
}
Run Code Online (Sandbox Code Playgroud)
并从这样的IntentService发布:
_bus = new MainThreadBus();
_bus.post(request.createRESTRequestProgress(RESTRequest.STATUS_STARTED));
Run Code Online (Sandbox Code Playgroud)
并且没有收到消息.另一种配置让我接收到了线程错误,所以我现在正在使用它.
那么,我错过了什么,或做错了什么?
编辑:感谢Andy在下面指出我的代码没有按照我的想法行事.上面的代码现在反映了基于该反馈的修改.
除了这个实现不是Singleton这个事实,当得到这个错误时,你可以在构造函数中使用threadEnforcer.ANY选项:
private static final Bus BUS = new Bus(ThreadEnforcer.ANY);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6992 次 |
| 最近记录: |