- Что такое otto android
- Usage
- Publishing
- Subscribing
- Producing
- Thread Enforcement
- Download
- Gradle
- Maven
- Contributing
- Русские Блоги
- [Android] Отто исходный код
- Пример
- Инициализация
- ThreadEnforcer
- identifier
- handlerFinder
- Регистрация / антирегистрация события
- @Subscribe
- bus.register
- EventProducer и EventHandler.
- dispatchProducerResultToHandler
- bus.unregister
- Инцидент по доставке
- flattenHierarchy
- Dispatch Queue
- Структурная карта
- Как использовать шину событий Otto с аннотациями Android
- 1 ответ
- Похожие вопросы:
Что такое otto android
Otto is an event bus designed to decouple different parts of your application while still allowing them to communicate efficiently.
Forked from Guava, Otto adds unique functionality to an already refined event bus as well as specializing it to the Android platform.
Usage
Otto is designed with Android-specific use cases in mind and is intended for use as a singleton (though that is not required). Create an instance of an event bus with Because a bus is only effective if it is shared, we recommend obtaining the instance through injection or another appropriate mechanism.
Publishing
Event publishing is the most important part of the bus as it allows you to tell subscribers that an action has occurred. An instance of any class may be published on the bus and it will only be dispatched to subscribers for that type.
To publish a new event, call the post method:
Posting to the bus is a synchronous action so when program execution continues it is guaranteed that all subscribers have been called.
Subscribing
Subscription is the complement to event publishing—it lets you receive notification that an event has occurred. To subscribe to an event, annotate a method with @Subscribe . The method should take only a single parameter, the type of which will be the event you wish to subscribe to.
To listen for the event published in the previous section we would need the following:
The name of the method can be anything you like. The annotation, single argument, and public accessor are all that is required.
In order to receive events, a class instance needs to register with the bus. If this refers to an instance of the class in which the previous method was present, we can register using the following:
Registering will only find methods on the immediate class type. Unlike the Guava event bus, Otto will not traverse the class hierarchy and add methods from base classes or interfaces that are annotated. This is an explicit design decision to improve performance of the library as well as keep your code simple and unambiguous.
Remember to also call the unregister method when appropriate. See the sample application, available on GitHub, for a complete example.
Producing
When subscribing to events it is often desired to also fetch the current known value for specific events (e.g., current location, active user, etc.). To address this common paradigm, Otto adds the concept of ‘Producers’ which provide an immediate callback to any subscribers upon their registration.
To create a producer, annotate a method with @Produce . The method should take no parameters and its return type will be used as the type of event for which it can produce initial values. If we are keeping track of the last answer event somewhere from above we can register to produce its initial value:
Producers, like subscribers, must also be registered:
When registering, the producer method will be called once for each subscriber previously registered for the same type. The producer method will also be called once for each new method that subscribes to an event of the same type.
You may only have one producer per event type registered at a time on a bus.
Thread Enforcement
Since at times it may be ambiguous on which thread you are receiving callbacks, Otto provides an enforcement mechanism to ensure you are always called on the thread you desire. By default, all interaction with an instance is confined to the main thread.
If you are not concerned on which thread interaction is occurring, instantiate a bus instance with ThreadEnforcer.ANY . You can also provide your own implementation of the ThreadEnforcer interface if you need additional functionality or validation.
Download
The source code to the Otto, its sample, and this website is available on GitHub.
Gradle
Maven
Once you’ve installed Otto, add the following lines to your proguard-project.txt file:
This ensures your annotated methods aren’t removed by ProGuard.
Contributing
If you would like to contribute code you can do so through GitHub by forking the repository and sending a pull request.
When submitting code, please make every effort to follow existing conventions and style in order to keep the code as readable as possible. Please also make sure your code compiles by running mvn clean verify .
Before your code can be accepted into the project you must also sign the Individual Contributor License Agreement (CLA).
Источник
Русские Блоги
[Android] Отто исходный код
Пример
Эта статья в основном расширена в соответствии со следующим примером:
Инициализация
Давайте взглянем Bus bus = new Bus() Это предложение, соответствующий исходный код выглядит следующим образом:
Параметр по умолчанию — Enforcer = ThreehenForcerCer.Main, идентификатор = default_дентификатор, handlerfinder = handlerfinder.annoted. Давайте посмотрим, что означают эти параметры.
ThreadEnforcer
ThreadenForcer — это интерфейс, который используется для проверки, является ли текущая нить указанным типом резьбы:
Используйте ThreepenForcerCHANCONFORCORCONTORMCONMAIN без параметров, указывающие на то, что метод Enforce () должен выполняться на главной ните.
identifier
Идентификатор — это только имя шины, используется отладка.
handlerFinder
Handlerfinder используется для поиска абонента и производителя при регистрации / обратной регистрации и последующее разрешение уровня исходного кода. Используйте Handlerfinder по умолчанию .annoted, чтобы использовать аннотацию, чтобы найти использование аннотации.
В дополнение к вышесказанному классу автобус также имеет два переменных участника, обработчики погрузочно-погружения в список:
Обработка событий и производителя событий используются для поиска обработки событий и продуктов событий по типу (тип класса) события.
Регистрация / антирегистрация события
Как показано ниже, чтобы стать подписчиной подписки на подписку AssilealableEventeEvent, просто зарегистрируйте его в шине, а затем используйте метод обратного вызова аннотации @subscribe. Метод обратного вызова требует видимости, как общедоступность, существует только один параметр, и тип является подписанным событием.
@Subscribe
Сначала посмотрите на @subscribe Annotations:
RetimentPolicy.runtime Указывает, что это аннотация выполнения времени выполнения, а ElementType.method указывает, что метод используется.
bus.register
Посмотрите на процесс реестра:
В целом, регистрация сделала три вещи: вызвало новый продукт; зарегистрируйте новые отношения обработчика событий; запуск старого продукта. Кроме того, есть два очка, чтобы обратить внимание на:
Поскольку событие передачи / обработки часто используется в сценарии общего пользования, использование PeopleonWritearRayset используется в качестве контейнера для сохранения событий и обработчиков в качестве сохранения события и обработчика, если часто используется операция регистрации / антирегистрации.
Когда контейнер POPEONWRITE не остановлен, скопируйте одну копию при записи, а затем заменяет исходный контейнер. Если происходит операция чтения (или когда она читается), возникает, когда контейнер записан, объект операции чтения — это снимок контейнера (снимка).
Поскольку метод регистра не заблокирован, в 3-1, хотя ученики существовали, все равно необходимо использовать Putifabsnt для сохранения обработчика.
EventProducer и EventHandler.
Обратите внимание, что шина находит производитель и подписчик на объекте Handlerfinder, а затем посмотрите на реализацию Handlerfinder:
Если метод FindallProduces возвращает EventProducer, соответствующий типу события, FindallSubsCribers возвращает коллекцию EventHandler, соответствующую типу события. Давайте посмотрим на EventProducer и EventHandler.
EventProducer — это класс упаковки для метода продюсера, исходный код выглядит следующим образом:
Метод ProducteVeeVent используется для получения события. Можно видеть, почему OTTO требует функции продукта, которая не может быть параметрами.
Подобно EventProducer, EventHandler является классом упаковки метода обработчика событий (обратный вызов события), исходный код выглядит следующим образом:
Способ поручения используется для настройки метода ручки (обратный вызов события) на объекте, входящий объект события. Можно увидеть, почему OTTO требует функции обработчика событий, которые могут иметь только параметр.
dispatchProducerResultToHandler
Метод DispatchProducerresulttohandler используется для распределения события, создаваемого производителем до соответствующего обработчика. Исходный код выглядит следующим образом:
Логика относительно проста, в основном после использования метода ProducteEvent () для получения метода EventHandler ().
bus.unregister
Метод Unregoster класса шин используется для облегчения связи между целевыми объектами и шиной, включая метод производительности на объекте, методе подписчика и исходный код следующим образом:
Инцидент по доставке
Простая операция доставки событий выглядит следующим образом:
Давайте посмотрим на исходный код метода пост:
Обратите внимание на несколько очков:
При отправке события также будет также призван подписаться на подписку на метод абонента.
Событие будет поставленоВызов в потокеОчередь разделена на время.
Следующие пункты будут описаны подробно.
flattenHierarchy
При выполнении операции пост вы сначаи получите родительский класс событий или интерфейс через метод FlattenHirchy:
Отсюда вы можете сделать это, Flattenhirarchy () использует приоритет глубины, чтобы экспортировать все родительские классы бетонеклассными для GetClassesfor ().
Dispatch Queue
Событие, поставляемое по методу Post, сначала поместите его в очередь отправки в текущем потоке, а затем распределить его. Класс автобуса имеет следующие свойства участника:
EventStodispatch — это объект ThreadLocal, который генерирует новый экземпляр CONCURRENTLINKQUEURE каждый раз, когда intivitionValue (), Eventstodispatch. Мероприятие введено в очередь через метод EnqueueELENT (события, обертки), посмотрите на реализацию EnqueeeEvent ():
Предложение () Метод размещает объект EventWithHandler на хвост очереди текущего потока. Разница между методом предложения и методом «Добавить» заключается в том, что, когда невозможно вставить (например, пространство недостаточно) происходит, ложь оказывается, а тепло не выброшено. EventWithHandler Class имеет простую упаковку событий и обработчиков, следующим образом:
Далее посмотрите на реализацию метода Dispatchueuedevents:
Стоит отметить, что все аномалии, брошенные здесь, и процесс распределения событий остановлен после того, как исключение запечатлено до следующего раза.
Структурная карта
Таким образом, общая структура OTTO может быть представлена на следующем рисунке:
Источник
Как использовать шину событий Otto с аннотациями Android
Я работаю над приложением, в котором хочу использовать аннотации Android и событие Otto Bus от Square
Для интеграции этих двух библиотек вместе я перешел по этой ссылке здесь . Кроме того, я использовал Otto 2.0-wip lib, который предлагается там, а не то, что от Otto Git .
Вот как я делаю реализацию:
Я создал класс singleton для автобуса:
Я объявляю объект для этого класса внутри my Fragment Class , где я хочу subscribe в событиях :
Я отправляю событие на шину из my communicator class , когда оно получает callback от связи с сервером. Вот как я добираюсь до своего автобуса внутри этого класса:
А это мой ChangeUserDetailsEvent класс:
Проблема: моя проблема заключается в том, что мой метод, подписанный на событие шины onChangeUserDetailsEvent , не вызывается, и я даже не знаю, как отладить, чтобы исправить эту проблему.
Я должен упомянуть, что событие шины отлично работает, когда я реализую его в Fragment , который не использует аннотации, и Bus singleton без аннотаций. Это класс Bus singleton, когда я не использую аннотации:
EDIT
У меня также есть проблема, когда я обновляю до androidannotations:3.2 , меняя свой gradle file с:
compile ‘org.androidannotations:androidannotations:3.1’ apt ‘org.androidannotations:androidannotations:3.1’
compile ‘org.androidannotations:androidannotations:3.2’ apt ‘org.androidannotations:androidannotations:3.2’ .
Для версии 3.1 он компилируется, но не работает otto event bus . С версией 3.2 это дает error.This означает, что библиотека AA внесла некоторые изменения, которые мне нужно реализовать, или у нее есть ошибки. Как я могу найти решение ?
Это одна из ошибок (для демонстрации): Error:(27, 25) error: cannot find symbol class UserAccountActivity_ which is a class that is activity.
Это мой androidannotations.log:
1 ответ
В настоящее время я работаю над своим первым приложением backbone.js. Концепция событий мне вполне знакома, но я сомневаюсь, следует ли мне использовать центральный диспетчер событий или нет. В целом я вижу эти два подхода: Непосредственно соедините издателей событий и приемников событий вместе.
Я использую шину событий Otto для подписки на запросы Volley. Я хочу использовать этот универсальный класс, но неправильный фрагмент (подписчик) пытается обработать событие. Можно ли использовать универсальный класс или случайным образом вызывается каждый подписчик VolleyResultEvent, независимый.
у AndroidAnnotations 3.1 была ошибка: он не обрабатывал аннотации Produce и Subscribe . В AA 3.2 я исправил эту проблему.
Вы можете спросить, почему AA вообще должен обрабатывать эти аннотации? К сожалению, Отто не может читать аннотации из родительских классов. Но с AA вы всегда используете сгенерированный подкласс. Это означает, что когда Отто обрабатывает сгенерированный подкласс, он не находит никаких аннотаций Отто, поэтому ваш метод обработчика событий не вызывался. Чтобы обойти эту проблему, мы добавили два обработчика аннотаций, которые обрабатывают Subscribe и Produce . Эти обработчики только переопределяют метод в сгенерированном классе и копируют аннотации Otto в эти методы. Таким образом, Отто может читать аннотации в сгенерированном классе.
@Produce аннотированный не может иметь никаких аргументов, так как Отто не может понять, что вы хотите передать ему, когда он вызывает метод ( Otto doc ).
Похожие вопросы:
В моих приложениях Android я использую Otto в качестве шины событий и Dagger для инъекции зависимостей. В userguide Отто и во многих сообщениях в блоге рекомендуется использовать инъекцию, чтобы.
Я планирую добавить шину событий Otto, чтобы отделить мои коммуникации. Одна из вещей, для которой я хочу использовать шину событий, — это связь между обработчиком нажатия кнопки и активностью. Идея.
Контекст: в предыдущем приложении Android, которое я разработал, я использовал шину событий ( otto by Square) для обработки результатов асинхронной задачи (например: результат запроса сервера.
В настоящее время я работаю над своим первым приложением backbone.js. Концепция событий мне вполне знакома, но я сомневаюсь, следует ли мне использовать центральный диспетчер событий или нет. В.
Я использую шину событий Otto для подписки на запросы Volley. Я хочу использовать этот универсальный класс, но неправильный фрагмент (подписчик) пытается обработать событие. Можно ли использовать.
Прямо сейчас я изучаю некоторые варианты учебного проекта android. Я пытаюсь общаться со своим rails api (тоже учебный проект). Проведя некоторые исследования, я думаю, что остановился на схеме.
Можно ли в приложении Android полностью избавиться от системы намерений и использовать только шину событий (Otto, greenrobot)? Например, можно ли достичь этого только с помощью шины событий, вообще.
Я использую шину событий Otto в своем приложении Android. Я прочитал документацию GitHub и различные вопросы, размещенные в интернете о том, как работает иерархический траверс: Регистрация найдет.
Пожалуйста, помогите мне выяснить, допустимы ли следующие сценарии, если я собираюсь использовать Otto Bus lib. Если мне нужно обеспечить порядок выполнения подписчика. У меня есть два компонента.
на площади github я нашел следующее утверждение: Устарело! Этот проект устарел в пользу RxJava и RxAndroid. Эти проекты позволяют использовать ту же модель событийного программирования, что и Otto.
Источник