#java #android #multithreading #android-activity #otto
#java #Android #многопоточность #android-активность #otto
Вопрос:
Я начал использовать библиотеку шины событий Otto для обновления интерфейса (действий) из разных компонентов в моем приложении для Android. Например, когда вносится изменение в класс модели, я отправляю сообщение на шину событий или, если AsyncTask
оно завершено, я отправляю событие на шину событий в onPostExecute
методе.
Пока я использую одну шину событий для обновлений пользовательского интерфейса. Я заметил, что даже приостановленные действия все еще получают эти события. В документации говорится
Приостановленная активность не получает пользовательского ввода и не может выполнить какой-либо код.
Что я нахожу спорным, я могу только объяснить это тем, что этот код, конечно, выполняется в другом потоке, но все еще находится в действии.
Мой вопрос в том, приводит ли это использование к каким-либо недостаткам? Приостановка нескольких действий, выполнение событий, обновление элементов (приостановленных) действий или их игнорирование. Приводит ли это к заметным накладным расходам или я могу это игнорировать?
Существует ли другой подход, когда нужно использовать шину событий для обновления интерфейса?
Комментарии:
1. Вы отменяете регистрацию своих действий из шины
onPause
? Это не похоже на вас, если вы заметили, что приостановленные действия обновляются. Одним из недостатков может быть то, что приостановленные действия могут быть прерваны, поэтому, если вы полагаетесь на получение событий во время приостановки для обеспечения согласованности пользовательского интерфейса / данных, вы можете столкнуться с проблемами.2. @swanson Точно, пока нет, но с учетом этого все это кажется намного более разумным.
Ответ №1:
Приводит ли это к заметным накладным расходам или я могу это игнорировать?
Это невозможно сказать абстрактно. Это будет зависеть от того, какую работу вы выполняете и как часто вы это делаете.
Существует ли другой подход, когда нужно использовать шину событий для обновления интерфейса?
Нет требования, чтобы ваши действия и фрагменты прослушивали события, пока они находятся в фоновом режиме. Например, вы можете зарегистрироваться для событий в onResume()
и отменить onPause()
регистрацию. Затем вы можете использовать другие методы (например, @Producer
шаблон Отто) для массового обновления пользовательского интерфейса вашей активности / фрагмента, когда он возвращается на передний onResume()
план.
Комментарии:
1. @beerBear: Аналогичная альтернатива чему? Если вы имеете в виду
@Producer
шаблон, вы можете попробовать sticky events в EventBus greenrobot.