Мне нужен хороший способ получить данные из потока в другое действие

#android #multithreading #thread-safety

#Android #многопоточность #потокобезопасность

Вопрос:

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

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

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

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

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

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

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

Ответ №1:

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

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

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

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

Ответ №2:

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

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

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

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

Комментарии:

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

2. кстати, что именно вы имеете в виду, когда говорите «Звучит так, как будто вы ищете способ обмена данными в памяти, и это просто не так, как работает модель активности Android?» Я думал, что телефон Android имеет фиксированный объем оперативной памяти для выполнения действий (по одному за раз), потоков, обработчиков, служб, асинхронных задач и т.д. И у него есть SD-карта для сохранения данных. Когда вы говорите «В Android обычные способы обмена данными между действиями (или, в вашем случае, действие с потоком, запущенное в другом действии)», что это должно быть сделано с использованием SD-карты? Это не кажется правильным.