5

ここで2つの問題のうちの1つを抱えているようです。次のようなエラーのいずれか:

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 に感謝します。上記のコードには、そのフィードバックに基づく変更が反映されています。

4

2 に答える 2

8

この実装がシングルトンではないという事実は別として、このエラーが発生した場合は、コンストラクターで threadEnforcer.ANY オプションを使用できます。

private static final Bus BUS = new Bus(ThreadEnforcer.ANY);
于 2015-04-09T13:35:45.047 に答える
3

問題は、コードが同じバス インスタンスと対話していないことです。それぞれの場合に新しい MainThreadBus を作成する代わりに、ファクトリまたはインジェクションによって取得されたシングルトンなど、同じバスにアクセスする必要があります。

于 2013-07-03T23:27:33.910 に答える