Android
GreenRobot EventBus
수색…
통사론
- @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를 인수로 사용하는 메소드를 찾고 호출 할 스레드에서 호출합니다.