Recherche…


Remarques

Otto est déconseillé en faveur de RxJava et RxAndroid . Ces projets permettent d'utiliser le même modèle de programmation événementiel qu'Otto, mais ils sont plus performants et offrent un meilleur contrôle du threading.

Passer un événement

Cet exemple décrit la réussite d'un événement à l'aide du bus d'événements Otto .

Pour utiliser le bus d'événements Otto dans Android Studio, vous devez insérer l'instruction suivante dans le fichier de graduation de vos modules:

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

L'événement que nous aimerions transmettre est un simple objet Java:

public class DatabaseContentChangedEvent {
    public String message;

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

Nous avons besoin d'un bus pour envoyer des événements. C'est typiquement un 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() {
    }
}

Pour envoyer un événement, nous avons uniquement besoin de notre méthode BusProvider et de sa méthode post . Ici, nous envoyons un événement si l'action d'un AsyncTask est terminée:

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

    ...

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

Recevoir un événement

Pour recevoir un événement, il est nécessaire d'implémenter une méthode avec le type d'événement en tant que paramètre et de l'annoter à l'aide de @Subscribe . De plus, vous devez enregistrer / désenregistrer l'instance de votre objet sur le BusProvider (voir exemple Envoi d'un événement ):

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

Important: pour recevoir cet événement, une instance de la classe doit exister. Ce n'est généralement pas le cas lorsque vous souhaitez envoyer un résultat d'une activité à une autre. Donc, vérifiez votre cas d'utilisation pour le bus d'événements.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow