gpt4 book ai didi

android - 问题订阅/接收从 IntentService 发布的 Otto 事件

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:06:02 24 4
gpt4 key购买 nike

我似乎遇到了两个问题之一。错误如:

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);
}
});
}
}
}

在这样的 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);
}

然后像这样从 IntentService 发布:

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

并且没有收到消息。另一种配置让我收到了线程错误,所以我暂时使用这个。

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

编辑:感谢下面的 Andy 指出我的代码没有像我想象的那样运行。上面的代码现在反射(reflect)了基于该反馈的修改。

最佳答案

除了这个实现不是单例的事实之外,当出现这个错误时,你可以在构造函数中使用 threadEnforcer.ANY 选项:

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

关于android - 问题订阅/接收从 IntentService 发布的 Otto 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17439784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com