Android - эффективный способ передачи уведомлений о событиях в активность, которая может быть неактивной? - PullRequest
3 голосов
/ 09 июля 2011

У меня есть сложное приложение, в котором есть фоновые потоки (которые могут быть в службе), которые, когда они получают данные из Интернета, должны уведомлять меня об основной активности отображения (чтобы обновить некоторые индикаторы состояния). Все запускаются в одном и том же процессе (я не вижу причин делать иначе).

Однако в некоторых случаях эти события происходят часто - 5 в секунду. Кроме того, события могут происходить, когда активность невидима или даже уничтожена. Я думаю, что единственным вопросом в этом вопросе является вопрос эффективности. Я все еще нацеливаюсь на G1, например.

Есть ряд методов, упомянутых в этой теме , но я не знаю, какие из них достаточно эффективны, и будут работать, если действие будет уничтожено. Эти методы являются «способом Android», которому я бы предпочел следовать.

У меня есть три уродливых способа против Android, которые работают, но у них также есть недостатки:

  1. В действии есть поток, ожидающий семафор, и после освобождения выполняет обновление. Недостатки: дополнительный поток, как обрабатывать несколько типов событий
  2. Как и # 1, но использовать объект очереди одновременной блокировки. Недостатки: дополнительный поток, один и тот же тип события может несколько раз попадать в очередь (не хорошо)
  3. Сохраняйте статическую ссылку на обработчик в действии и используйте его для запуска средства обновления. Недостатки: (а) может утечка ссылки на деятельность? (б) что происходит, когда активность меняет состояние? (c) несколько исполняемых объектов могут оказаться там, когда нужен только один.

1 Ответ

3 голосов
/ 09 июля 2011

Кроме того, события могут происходить, когда активность невидима или даже уничтожена.

Если ваша деятельность уничтожена, обновлять нечего. Если и когда пользователь решит повторно посетить это действие, оно может получить текущую информацию в onResume() для отображения.

Если ваша деятельность находится в фоновом режиме, обновлять тоже ничего не нужно. Опять же, если и когда пользователь решит повторно посетить это действие, оно может получить текущую информацию в onResume() для отображения.

ТОЛЬКО время, когда вам нужно, чтобы действие было уведомлено о событиях в режиме реального времени, - это если действие находится на переднем плане. В этом случае любое из решений, которые я изложил в ответе, с которым вы связали , могло бы работать. Вариант связывания или Messenger, вероятно, являются наиболее легкими решениями.

У меня есть сложное приложение с фоновыми потоками (которое может быть в службе)

Не «может быть» - «должно быть», если они находятся за пределами действия любого данного экземпляра действия.

У меня есть три уродливых способа против Android, которые работают

Ни один из них не работает без потенциальных утечек памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...