Szukaj…


Uwagi

Otto jest przestarzałe na rzecz RxJava i RxAndroid . Projekty te dopuszczają ten sam model programowania sterowany zdarzeniami, co Otto, ale są bardziej zdolne i oferują lepszą kontrolę nad wątkami.

Przekazywanie wydarzenia

W tym przykładzie opisano przekazanie zdarzenia za pomocą magistrali zdarzeń Otto .

Aby użyć Magistrali zdarzeń Otto w Android Studio , musisz wstawić następującą instrukcję do pliku ocen modułów:

dependencies {
    compile 'com.squareup:otto:1.3.8'
}

Wydarzenie, które chcielibyśmy przekazać, to prosty obiekt Java:

public class DatabaseContentChangedEvent {
    public String message;

    public DatabaseContentChangedEvent(String message) {
        this.message = message;
    }
}

Potrzebujemy autobusu do wysyłania wydarzeń. Zazwyczaj jest to singleton:

import com.squareup.otto.Bus;

public final class BusProvider {
    private static final Bus mBus = new Bus();

    public static Bus getInstance() {
        return mBus;
    }

    private BusProvider() {
    }
}

Aby wysłać wydarzenie, potrzebujemy tylko naszego BusProvider i jego metody post . Tutaj wysyłamy zdarzenie, jeśli akcja AsyncTask jest zakończona:

public abstract class ContentChangingTask extends AsyncTask<Object, Void, Void> {

    ...

    @Override
    protected void onPostExecute(Void param) {
        BusProvider.getInstance().post(
            new DatabaseContentChangedEvent("Content changed")
        );
    }
}

Odbieranie wydarzenia

Aby otrzymać zdarzenie, konieczne jest zaimplementowanie metody z typem zdarzenia jako parametrem i @Subscribe go adnotacją za pomocą @Subscribe . Ponadto musisz zarejestrować / wyrejestrować wystąpienie swojego obiektu w BusProvider (patrz przykład Wysyłanie zdarzenia ):

public class MyFragment extends Fragment {
    private final static String TAG = "MyFragment";

    ...

    @Override
    public void onResume() {
        super.onResume();
        BusProvider.getInstance().register(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        BusProvider.getInstance().unregister(this);
    }

    @Subscribe
    public void onDatabaseContentChanged(DatabaseContentChangedEvent event) {
        Log.i(TAG, "onDatabaseContentChanged: "+event.message);
    }
}

Ważne: Aby otrzymać to zdarzenie, musi istnieć instancja klasy. Zwykle nie dzieje się tak, gdy chcesz wysłać wynik z jednego działania do drugiego. Sprawdź więc przypadek użycia magistrali zdarzeń.



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