Zoeken…


Opmerkingen

Otto is verouderd ten gunste van RxJava en RxAndroid . Deze projecten staan hetzelfde event-driven programmeermodel toe als Otto, maar ze zijn capabeler en bieden betere controle over threading.

Een evenement passeren

Dit voorbeeld beschrijft het passeren van een evenement met behulp van de Otto Event Bus .

Om de Otto Event Bus in Android Studio te gebruiken , moet u de volgende verklaring in uw gradle-bestand van modules invoegen:

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

De gebeurtenis die we willen passeren is een eenvoudig Java-object:

public class DatabaseContentChangedEvent {
    public String message;

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

We hebben een bus nodig om evenementen te verzenden. Dit is meestal een 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() {
    }
}

Om een evenement te verzenden, hebben we alleen onze BusProvider en zijn post methode nodig. Hier sturen we een evenement als de actie van een AsyncTask is voltooid:

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

    ...

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

Een evenement ontvangen

Om een gebeurtenis te ontvangen, is het noodzakelijk om een methode met het gebeurtenistype als parameter te implementeren en deze te annoteren met @Subscribe . Verder moet u de instantie van uw object registreren / afmelden bij de BusProvider (zie voorbeeld Een gebeurtenis verzenden ):

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

Belangrijk: om die gebeurtenis te ontvangen, moet een instantie van de klasse bestaan. Dit is meestal niet het geval wanneer u een resultaat van de ene activiteit naar een andere activiteit wilt verzenden. Controleer dus uw use case voor de evenementenbus.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow