수색…


통사론

  • @Subscribe (threadMode = ThreadMode.POSTING) public void onEvent (EventClass 이벤트) {}

매개 변수

스레드 모드 기술
ThreadMode.POSTING 이벤트가 게시 된 동일한 스레드에서 호출됩니다. 이것은 기본 모드입니다.
ThreadMode.MAIN 기본 UI 스레드에서 호출됩니다.
ThreadMode.BACKGROUND 배경 스레드에서 호출됩니다. 게시 스레드가 주 스레드가 아닌 경우 사용됩니다. 주 스레드에 게시 된 경우 EventBus 에는 사용할 단일 배경 스레드가 있습니다.
ThreadMode.ASYNC 자체 스레드에서 호출됩니다.

Event 객체 만들기

이벤트를 송수신하려면 먼저 Event 객체가 필요합니다. 이벤트 객체는 실제로 간단한 POJO입니다.

public class ArbitaryEvent{
    public static final int TYPE_1 = 1;
    public static final int TYPE_2 = 2;
    private int eventType;
    public ArbitaryEvent(int eventType){
        this.eventType = eventType;
    }
    
    public int getEventType(){
        return eventType;
    }
}

이벤트 수신

이벤트를 받기 위해서는 EventBus 클래스를 등록해야합니다.

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
   EventBus.getDefault().unregister(this);
   super.onStop();
}

그런 다음 이벤트에 가입하십시오.

@Subscribe(threadMode = ThreadMode.MAIN)
public void handleEvent(ArbitaryEvent event) {
    Toast.makeText(getActivity(), "Event type: "+event.getEventType(), Toast.LENGTH_SHORT).show();
}

이벤트 보내기

이벤트를 보내는 것은 Event 객체를 만든 다음 게시하는 것만 큼 쉽습니다.

EventBus.getDefault().post(new ArbitaryEvent(ArbitaryEvent.TYPE_1));

간단한 이벤트 전달

먼저 EventBus를 모듈의 gradle 파일에 추가해야합니다.

dependencies {
    ...
    compile 'org.greenrobot:eventbus:3.0.0'
    ...
}

이제 우리 이벤트를위한 모델을 만들어야합니다. 전달하려는 모든 것을 포함 할 수 있습니다. 지금은 빈 클래스 만 만들 것입니다.

public class DeviceConnectedEvent
{
}

이제 EventBus에 등록하고 이벤트를 구독하는 코드를 Activity 추가 할 수 있습니다.

public class MainActivity extends AppCompatActivity
{
    private EventBus _eventBus;

    @Override
    protected void onCreate (Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        _eventBus = EventBus.getDefault();
    }

    @Override
    protected void onStart ()
    {
        super.onStart();
        _eventBus.register(this);
    }

    @Override
    protected void onStop ()
    {
        _eventBus.unregister(this);
        super.onStop();
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onDeviceConnected (final DeviceConnectedEvent event)
    {
        // Process event and update UI
    }
}

Activity 에서는 onCreate() 메소드에서 EventBus 의 인스턴스를 얻습니다. 우리는 onStart() / onStop() 에 이벤트 등록 / 등록 해제를합니다. 청취자가 범위를 상실하거나 Activity 유출 할 수있는 경우 등록을 취소하는 것을 기억하는 것이 중요합니다.

마지막으로 이벤트와 함께 호출 할 메서드를 정의합니다. @Subscribe 어노테이션은 이벤트를 처리 할 수있는 메소드를 EventBus에 알려줍니다. EventBus에 등록하려면 @Subscribe 로 주석 된 메소드가 하나 이상 있어야합니다. 그렇지 않으면 예외가 발생합니다. 주석에서 스레드 모드를 정의합니다. 이것에 의해, 어느 thread가 메서드를 호출 할 수 있을지를 EventBus에 알립니다. 백그라운드 스레드에서 UI 스레드로 정보를 전달하는 매우 편리한 방법입니다! 그것이 바로 우리가 여기서하는 일입니다. ThreadMode.MAIN 은 안드로이드의 메인 UI 쓰레드에서이 메소드가 호출된다는 것을 의미하므로 필요에 따라 UI 조작을하는 것이 안전합니다. 메서드의 이름은 중요하지 않습니다. EventBus가 찾고있는 @Subscribe 어노테이션 이외의 유일한 생각은 인수 유형입니다. 유형이 일치하는 한 이벤트가 게시되면 호출됩니다.

이벤트를 게시하기 위해 마지막으로해야 할 일. 이 코드는 Service 됩니다.

EventBus.getDefault().post(new DeviceConnectedEvent());

그게 전부입니다! EventBus는 해당 DeviceConnectedEvent를 가져 와서 등록 된 리스너를 살펴보고 가입 한 메소드를 살펴보고 DeviceConnectedEvent를 인수로 사용하는 메소드를 찾고 호출 할 스레드에서 호출합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow