Мне нужен хороший способ получить данные из потока в другое действие - PullRequest
3 голосов
/ 08 июня 2011

Я задавал различные формы этого вопроса раньше и получил разные мнения.В основном мне посоветовали заняться чтением и экспериментами.Но безрезультатно.Я до сих пор не понимаю ни одного альтернативного решения, которое было предложено.Опять же, я разрабатываю приложение для Android, которое отображает данные Bluetooth .

У меня есть операция Bluetooth, которая, очевидно, создает фоновый поток, который обновляет экран данными, которые он получает через соединение Bluetooth,Когда я запускаю другое / новое действие для построения графика данных, я вижу, как фоновый поток bluetooth продолжает писать в Logcat . Так что я точно знаю, что фоновый поток bluetooth все еще работает, когда я запускаю свою активность Plot .

Моя цель - построить данные bluetooth, которые постоянно предоставляются фоновым потоком Bluetooth. Я добился успеха следующим образом: , так как этот фоновый поток bluetooth все еще работает, я решил использовать его метод update () для вызова статического метода Plot.plotData () для построения графика данных. И это работает , но я не понимаю почему. Он будет работать бесконечно без проблем - получение и отображение данных Bluetooth .

Но мне сообщили, что это, вероятно, не очень хорошее решение из-за возможного: потокобезопасность , утечка памяти , блокировка основного потока пользовательского интерфейса и т. Д. .Хотя я не сталкивался ни с одной из этих проблем, я не хочу делать вывод, что мое решение является хорошим из-за полученных отзывов.

Было предложено попробовать Service, AsyncTask и т. Д. Вместо вызовастатический метод my Plot.plotData () из метода update () фонового потока bluetooth.Но из проведенного мною исследования я не понимаю, как изменить свое решение на более подходящее.

Если кто-то найдет более подходящее решение, пожалуйста, озвучьте и опишите его. Я не хочу двигаться вперед, если есть проблема с моим текущим решением .

Если вы хотите увидеть исходный код, я был бы рад опубликовать его.

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

Что бы я сделал, это поместил данные BT (то, что у вас есть в потоке bkg) в службу Android, которая также управляет потоком bkg.С помощью этой службы вы можете передавать обновления, хотя и намеренно, или разрешить привязке активности к этой службе.Таким образом, любая активность, которая знает, что слушать, может прослушивать ваши данные.

Взгляните на http://developer.android.com/guide/topics/fundamentals/services.html, чтобы получить представление об услугах.Вы можете погрузиться глубже, как только поймете основы.

Также прочитайте это: http://developer.android.com/resources/articles/multitasking-android-way.html

Я также хотел бы добавить, что вы, вероятно, не найдете «идеальный» или «правильный ответ, вам нужно взглянуть на документы и немного испачкать руки, чтобы увидеть, что лучше всего подходит для вашей конкретной проблемы.

1 голос
/ 08 июня 2011

В Android распространенными способами обмена данными между действиями (или, в вашем случае, действием с потоком, запущенным в другом действии) является

  1. База данных SQLite - вероятно, вполне применимо здесь
  2. Служба - также применимо
  3. Содержание - не очень применимо
  4. Поставщик контента - больше работы, чем база данных, и в этом случае имеет ограниченную дополнительную ценность
  5. Файлы - возможноне так хорош, как база данных
  6. Общие настройки - не применимо

Похоже, вы ищете способ обмена данными в памяти, а это просто не тот способ, которымМодель активности Android работает.Вы спрашиваете, есть ли проблема с вашим подходом, и ответ определенно да.

Я предлагаю изучить Сервис или Базы данных , чтобы решить эту проблему и избавиться отваши статические методы.

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