События или обработчики? Вызов методов из потока - PullRequest
0 голосов
/ 16 июня 2011

Рассмотрим простое приложение для Android: есть две функции TabActivities и поток в фоновом режиме, получающий целочисленные значения с сервера. Если число четное, оно должно отображаться на первой вкладке, в противном случае на второй. Очевидно, я буду делать что-то более сложное, но это основной шаблон. Как мне это сделать? Я целый день чесал голову, и вот что мне встречалось:

  1. Использование EventHandlers. Два TabActivities регистрируются для прослушивания my_events, и когда поток получает значение, он «выбрасывает my_event», после чего вызываются конкретные методы в обоих этих активах, и значение передается.

  2. Использование обработчиков.

Я не использовал оба эти понятия раньше, и мне хотелось бы знать, какой из них может быть лучшим / правильным путем. Далее, любые дополнительные советы по выбранному маршруту будут оценены. Кроме того, этот поток должен быть запущен из класса обслуживания?

Ответы [ 2 ]

0 голосов
/ 22 июня 2011

Возможно, вы хотите посмотреть на использование AysncTask. Если вы сделаете это, вы захотите вставить значения в соответствующую вкладку в методе onProgressUpdate (). Поскольку аргументы, передаваемые этому методу, на самом деле не могут в достаточной степени представлять входящие данные, вам просто нужно поместить новые данные куда-нибудь, чтобы к ним можно было получить доступ из метода onProgressUpdate (), возможно, в переменной-члене. Помните, что доступ к этой переменной-члену, вероятно, необходимо синхронизировать, поскольку код в onProgressUpdate выполняется в основном потоке приложения, а код в doInBackground - в фоновом потоке, поэтому код в этих методах будет выполняться одновременно.

AsyncTask прозрачно использует обработчики для вас, но вы можете использовать необработанные обработчики, если хотите. Основные вещи, которые вы должны иметь в виду:

  • Вы можете / должны обновлять пользовательский интерфейс только из основного потока приложения
  • Код в обработчике будет всегда выполняться в потоке, создавшем обработчик
  • Обработчики должны быть созданы в потоке с лупером (основной поток имеет лупер)
  • Будьте осторожны, создавая Handler как анонимный внутренний класс или передавая ему ссылку на Context, так как это может привести к утечке памяти

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

0 голосов
/ 17 июня 2011

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

...