Szukaj…


Składnia

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

Parametry

Tryb wątku Opis
ThreadMode.POSTING Zostanie wywołany w tym samym wątku, w którym wydarzenie zostało opublikowane. To jest tryb domyślny.
ThreadMode.MAIN Zostanie wywołany w głównym wątku interfejsu użytkownika.
ThreadMode.BACKGROUND Zostanie wywołany w wątku w tle. Jeśli wątek wysyłający nie jest głównym wątkiem, zostanie użyty. Jeśli opublikowany w głównym wątku, EventBus ma pojedynczy wątek w tle, którego będzie używał.
ThreadMode.ASYNC Zostanie wywołany w swoim wątku.

Tworzenie obiektu zdarzenia

Do wysyłania i odbierania zdarzeń potrzebujemy najpierw obiektu Event. Obiekty zdarzeń są w rzeczywistości prostymi 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;
    }
}

Odbieranie zdarzeń

Aby otrzymywać wydarzenia, musisz zarejestrować swoją klasę na EventBus .

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

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

A potem subskrybuj wydarzenia.

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

Wysyłanie wydarzeń

Wysyłanie zdarzeń jest tak proste, jak utworzenie obiektu Event, a następnie opublikowanie go.

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

Przekazywanie prostego zdarzenia

Pierwszą rzeczą, którą musimy zrobić, to dodać EventBus do pliku ocen naszego modułu:

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

Teraz musimy stworzyć model naszego wydarzenia. Może zawierać wszystko, co chcemy przekazać. Na razie stworzymy pustą klasę.

public class DeviceConnectedEvent
{
}

Teraz możemy dodać kod do naszej Activity , która zarejestruje się w EventBus i zasubskrybuje wydarzenie.

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

W tym Activity otrzymujemy instancję EventBus w onCreate() . Rejestrujemy / wyrejestrowujemy zdarzenia w onStart() / onStop() . Ważne jest, aby pamiętać o wyrejestrowaniu się, gdy słuchacz traci zasięg lub możesz wyciec swoją Activity .

Na koniec definiujemy metodę, którą chcemy wywołać ze zdarzeniem. Adnotacja @Subscribe informuje EventBus, jakich metod może szukać do obsługi zdarzeń. Musisz zarejestrować co najmniej jedną metodę z @Subscribe aby zarejestrować się w EventBus, inaczej spowoduje to wyjątek. W adnotacji definiujemy tryb wątku. To informuje EventBus, w którym wątku wywołać metodę. Jest to bardzo przydatny sposób przekazywania informacji z wątku tła do wątku interfejsu użytkownika! Właśnie to tutaj robimy. ThreadMode.MAIN oznacza, że ta metoda zostanie wywołana w głównym wątku interfejsu użytkownika w systemie Android, więc można bezpiecznie wykonywać wszelkie potrzebne tu ThreadMode.MAIN w interfejsie użytkownika. Nazwa metody nie ma znaczenia. Jedyną @Subscribe , inną @Subscribe adnotacja @Subscribe , że EventBus szuka, jest typ argumentu. Dopóki typ pasuje, będzie wywoływany po opublikowaniu zdarzenia.

Ostatnią rzeczą, którą musimy zrobić, aby opublikować wydarzenie. Ten kod będzie w naszym Service .

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

To wszystko! EventBus weźmie DeviceConnectedEvent i przejrzy zarejestrowane przez nas nasłuchiwania, przejrzy metody, które subskrybują, i znajdzie te, które biorą DeviceConnectedEvent jako argument i wywoła je w wątku, który ma zostać wywołany.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow