Поиск…


замечания

Отто устарел в пользу 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);
    }
}

Важно. Чтобы получить это событие, должен существовать экземпляр класса. Обычно это не тот случай, когда вы хотите отправить результат из одной активности в другую. Поэтому проверьте свой вариант использования для шины событий.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow