Подтвердить что ты не робот

Как отправить событие из службы на активность с помощью шины событий Otto?

Простой BusProvider.getInstance().post() включить исключение не main thread. Как отправить событие из службы на активность с помощью шины событий Otto?

4b9b3361

Ответ 1

Чтобы публиковать сообщения из любого потока (основного или фона) и получать в основном потоке, попробуйте что-то вроде

public class MainThreadBus extends Bus {
  private final Handler mHandler = new Handler(Looper.getMainLooper());

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

Примечание: кредит относится к Jake Wharton и "pommedeterresaute" в https://github.com/square/otto/issues/38 для общего подхода. Я только что реализовал его с классом-оболочкой, а не подклассом.

Ответ 2

Чтобы опубликовать любой поток (основной или фоновый) и получить в основном потоке, используйте MainThreadBus вместо ванильного Bus

public class MainThreadBus extends Bus {
     private final Handler handler = new Handler(Looper.getMainLooper());

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

Это основано на ответе Энди Денни.

Нет необходимости как расширять, так и обертывать объект Bus, делать то или другое. В ответе Денни, который фактически является оберткой, базовый класс Bus используется только как интерфейс, все функции перезаписываются.

Это сработало бы, даже если вы удалили базовый класс Bus, если только вы не ссылались на MainThreadBus с помощью ссылки Bus.

Ответ 3

bus = новая шина (ThreadEnforcer.ANY); является ясным решением этой проблемы. Это все, что вам нужно сделать.

Ответ 4

Или просто сделайте это, если вы уверены, что отправляете сообщение из основного потока:

new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        mBus.post(new myEvent());
                    }
                });

Как говорится, "Держите это просто и глупо":)

Ответ 5

Лучший пользовательский класс шины для меня

public class AndroidBus extends Bus {
    private final Handler mainThread = new Handler(Looper.getMainLooper());

    @Override
    public void post(final Object event) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            super.post(event);
        } else {
            mainThread.post(() -> AndroidBus.super.post(event));
        }
    }
}

Ответ 6

Я сделал это просто:

Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                bus.post(event);
            }

        });

Счастливое кодирование..:)

Ответ 7

Просто создайте BasicBus с помощью ThreadEnforcer.NONE, чтобы отправить сообщение из не основных потоков. Упомянутый ThreadEnforcer.MAIN является полностью противоположным (и по умолчанию), который принимает только сообщения из основного потока.