Program Tip

Otto 이벤트 버스를 사용하여 서비스에서 활동으로 이벤트를 보내는 방법은 무엇입니까?

programtip 2020. 12. 10. 21:04
반응형

Otto 이벤트 버스를 사용하여 서비스에서 활동으로 이벤트를 보내는 방법은 무엇입니까?


단순한 BusProvider.getInstance().post()예외가 아닙니다 main thread. Otto 이벤트 버스를 사용하여 서비스에서 활동으로 이벤트를 보내는 방법은 무엇입니까?


모든 스레드 (메인 또는 백그라운드)에서 게시하고 메인 스레드에서 수신하려면 다음과 같이 시도하십시오.

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

참고 : 일반적인 접근 방식에 대해서는 https://github.com/square/otto/issues/38의 Jake Wharton과 "pommedeterresaute"가 크레딧을받습니다 . 서브 클래스가 아닌 래퍼 클래스로 구현했습니다.


모든 스레드 (메인 또는 백그라운드)에서 게시하고 메인 스레드에서 수신하려면 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);
                }
            });
        }
    }
}

이것은 Andy Dennie의 답변을 기반으로합니다.

Bus개체를 확장하고 감싸거나 둘 중 하나를 수행 할 필요가 없습니다 . 사실상 래퍼 인 Dennie의 대답에서 Bus기본 클래스는 인터페이스처럼 사용되며 모든 기능을 덮어 씁니다.

Bus참조 MainThreadBus를 통해 참조하지 않는 한 기본 클래스 를 제거하더라도 작동 Bus합니다.


또는 메인이 아닌 스레드에서 게시하는 것이 확실한 경우 다음과 같이하십시오.

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

"단순하고 어리석게 유지"라는 속담처럼 :)


버스 = new Bus (ThreadEnforcer.ANY); 이 문제에 대한 명확한 해결책입니다. 당신이해야 할 모든 것.


나를위한 최고의 구현 맞춤형 버스 클래스

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

나는 간단하게했다 :

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

        });

행복한 코딩 .. :)


Just create the BasicBus with ThreadEnforcer.NONE to post event from non-main threads. The mentioned ThreadEnforcer.MAIN is exactly the opposite (and the default), which accepts only posts from the main-thread.

참고URL : https://stackoverflow.com/questions/15431768/how-to-send-event-from-service-to-activity-with-otto-event-bus

반응형