Допустим, я в другом коде, который ничего не знает о первых два обработчиков щелчка не знаю, но я зарегистрировать еще один.
Могу ли я узнать, что в потоке есть два слушателя?
Нет, вы не можете. Вы можете расширить класс потока или обернуть его и предоставить эту функцию самостоятельно, но это не похоже на хороший выбор дизайна, потому что я не думаю, что слушатель должен знать о других слушателях. Что вы пытаетесь сделать точно? Возможно, есть лучший способ, чем позволить слушателям узнать друг о друге.
Могу ли я приостановить или отменить всех других подписчиков?
cancel/pause/resume Только подписчик, с которым имеете дело. Опять же, вы, вероятно, не должны прикасаться к другим слушателям, но я думаю, вы могли бы обернуть/расширить класс Stream, чтобы иметь такое поведение.
Если я пишу button.onClick.asBroadcastStream() снова в другом месте, указывает ли он на тот же поток, что и в основном?
Нет, по крайней мере, в текущей версии SDK. Поэтому, к сожалению, вам нужно где-то хранить ссылку на этот широковещательный поток и ссылаться на него, потому что многократное вызывание asBroadcastStream()
не приведет к ожидаемому результату. (Примечание: по крайней мере, основываясь на быстрых тестах: http://d.pr/i/Ip0K, хотя documentation, кажется, указывает разные, мне нужно еще немного проверить, когда найду время).
Могу ли я сказать в одном из обработчиков, чтобы передать событие другому слушателю вещания?
Ну, есть в HTML земли, что означает, что событие не будет распространяться на другие элементы stopPropagation()
, но это, вероятно, не то, что вы искали.
Для того, чтобы остановить запуск событий в других слушателях, необходимо, чтобы порядок слушателей вызывался. Я считаю, что порядок - это порядок регистрации этих слушателей.С точки зрения дизайна, я не думаю, что было бы неплохо позволить слушателю отменить/приостановить другие.
Распространение событий в HTML имеет смысл, так как речь идет об иерархии, но здесь у нас этого нет (и даже в случае событий в HTML для одного элемента может быть несколько слушателей).
Невозможно назначить вес слушателям или определить порядок важности, поэтому неудивительно, что нет способа остановить событие.
Вместо того чтобы позволить слушателям знать друг о друге и манипулировать друг другом, возможно, вам стоит попытаться подумать о другом способе подхода к вашей проблеме (что бы это ни было).
Это потребитель?
StreamConsumer
- это класс, который можно реализовать, если вы хотите разрешить передачу других потоков в ваш класс.
Вы ошибаетесь в отношении 'asBroadcastStream()' –
Хмм, я могу ошибаться, этот код: http://d.pr/i/Ip0K однако печатает сначала 'false', а затем' true'. Поэтому они ссылаются на разные объекты. Я могу рассказать об этом более подробно, когда найду время. Могут также быть изменения в кодовой базе, и помните, что то, что вы связали в своем ответе, отличается от, например, Реализация потока SDK :) –
Ваш код создает два широковещательных потока. Если вы вместо этого вызываете asBroadcastStream() в первом потоке вещания, который вы создали, вы получите то же самое. Это то, что задают. Реализация потока возвращает это, если это широковещательный поток. Я ссылался на поток, используемый в вопросе. –