Android
Автобус Отто
Поиск…
замечания
Отто устарел в пользу RxJava
и RxAndroid
. Эти проекты позволяют одной и той же модели программирования, управляемой событиями, как Otto, но они более способны и обеспечивают лучший контроль за потоками.
Передача события
В этом примере описывается передача события с использованием шины событий Otto .
Чтобы использовать Автобус Отто в Android Studio, вы должны вставить следующий файл в файл gradle:
dependencies {
compile 'com.squareup:otto:1.3.8'
}
Событие, которое мы хотели бы передать, - это простой объект Java:
public class DatabaseContentChangedEvent {
public String message;
public DatabaseContentChangedEvent(String message) {
this.message = message;
}
}
Для отправки событий нам нужен автобус. Обычно это синглтон:
import com.squareup.otto.Bus;
public final class BusProvider {
private static final Bus mBus = new Bus();
public static Bus getInstance() {
return mBus;
}
private BusProvider() {
}
}
Для отправки события нам нужен только наш BusProvider, и это метод post
. Здесь мы отправляем событие, если действие AsyncTask завершено:
public abstract class ContentChangingTask extends AsyncTask<Object, Void, Void> {
...
@Override
protected void onPostExecute(Void param) {
BusProvider.getInstance().post(
new DatabaseContentChangedEvent("Content changed")
);
}
}
Получение события
Для получения события необходимо реализовать метод с типом события в качестве параметра и аннотировать его с помощью @Subscribe
. Кроме того, вам необходимо зарегистрировать / BusProvider
регистрацию экземпляра вашего объекта в BusProvider
(см. Пример « Отправка события» ):
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);
}
}
Важно. Чтобы получить это событие, должен существовать экземпляр класса. Обычно это не тот случай, когда вы хотите отправить результат из одной активности в другую. Поэтому проверьте свой вариант использования для шины событий.