Ricerca…


Osservazioni

Otto è deprecato a favore di RxJava e RxAndroid . Questi progetti consentono lo stesso modello di programmazione event-driven di Otto, ma sono più capaci e offrono un migliore controllo del threading.

Passare un evento

Questo esempio descrive il passaggio di un evento utilizzando il bus eventi Otto .

Per utilizzare il bus eventi Otto in Android Studio devi inserire la seguente dichiarazione nel file gradle dei tuoi moduli:

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

L'evento che vorremmo passare è un semplice oggetto Java:

public class DatabaseContentChangedEvent {
    public String message;

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

Abbiamo bisogno di un autobus per inviare eventi. Questo è in genere 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() {
    }
}

Per inviare un evento abbiamo solo bisogno del nostro BusProvider e del suo metodo post . Qui inviamo un evento se l'azione di un AsyncTask è completata:

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

    ...

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

Ricevere un evento

Per ricevere un evento è necessario implementare un metodo con il tipo di evento come parametro e annotarlo usando @Subscribe . Inoltre devi registrare / annullare la registrazione dell'istanza del tuo oggetto su BusProvider (vedi esempio Invio di un evento ):

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

Importante: per ricevere quell'evento deve esistere un'istanza della classe. Questo di solito non è il caso quando si desidera inviare un risultato da un'attività a un'altra attività. Quindi controlla il tuo caso d'uso per il bus eventi.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow