Android: реализация шины событий Otto

Я разрабатываю приложение для Android, которое должно использовать разбиение на страницы на RecyclerView. Я использую Executor в Service для отправки веб-запросов к API, а затем сохраняю полученные данные в БД. Чтобы уведомлять об изменениях в БД, а затем применять новые данные в моем адаптере, я предлагаю использовать шину событий Otto. Шаблон издатель/подписчик для меня довольно новый, поэтому я пытался найти хороший учебник или объяснение, как это должно работать, но после двух дней поиска у меня есть только туманное представление о том, что я должен реализовать и как на самом деле работает шина событий. Может ли кто-нибудь дать хороший совет, с чего мне начать или дать ссылку на учебник или образец кода? я знаю, что это действительно вопрос новичка, но на данный момент я не вижу альтернативы.


person Autumn_Cat    schedule 15.12.2015    source источник


Ответы (2)


Лучшие руководства, которые я нашел: от Vogella и от Путь к коду. Я надеюсь, что это поможет кому-то. И хорошее замечание, основанное на моем опыте - Otto EventBus работает синхронно, имейте это в виду.

person Autumn_Cat    schedule 10.08.2016

импортируйте эту библиотеку в свой уровень приложения:

implementation 'org.greenrobot:eventbus:3.0.0'

создайте класс для обработки событий:

public class DataSyncEvent {
    private final String syncStatusMessage;
    private final String countryName;
    private final int postion;

    public DataSyncEvent(String syncStatusMessage, int postion, String countryName) {
        this.syncStatusMessage = syncStatusMessage;
        this.postion = postion;
        this.countryName = countryName;
    }

    public String getSyncStatusMessage() {
        return syncStatusMessage;
    }

    public String countryName() {
        return countryName;
    }

    public int getPostion() {
        return postion;
    }
}

теперь передайте значения из вашего класса/фрагмента или службы:

EventBus.getDefault().post(new DataSyncEvent(leftOrRight, position, countryName));

не забудьте зарегистрироваться и отменить регистрацию автобуса, на котором вы используете @Subscribe

@Override
    public void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }
    @Override
    public void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    } 

с @Subscribe вы можете получить эти значения:

 @Subscribe
    public void onEvent(DataSyncEvent syncStatusMessage) {


        if (syncStatusMessage.getSyncStatusMessage().contains("left")) {

            leftPosition = syncStatusMessage.getPostion();
            img_flag_left.setImageResource(countriesFlag[leftPosition]);
            leftCountryName.setText(syncStatusMessage.countryName());

        } else {
            rightPosition = syncStatusMessage.getPostion();
            img_flag_right.setImageResource(countriesFlag[rightPosition]);
            rightCountryName.setText(syncStatusMessage.countryName());
        }


    }
person Null Pointer Exception    schedule 13.03.2019