Как расширить существующее фоновое решение потока? - PullRequest
0 голосов
/ 04 июня 2011

Я использую Eclipse для разработки приложения Android, которое отображает данные Bluetooth.

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

Открытый исходный код имеет очень приятный и сплошной фоновый поток , который, помимо прочего, постоянно регистрирует BluetoothData в logcat даже при переключении на новое действие.

В настоящее время у меня есть решение, которое меня беспокоит: я просто использую метод фонового потока, который пишет в logcat, чтобы вызвать статический метод plotData () в моей работе с диаграммами.Результат кажется хорошим.Я получаю хороший сюжет.Это клип в реальном времени.Выглядит как осциллограф.

Но я получил отрицательный отзыв об использовании существующего фонового потока в сочетании со статическим методом для построения BluetoothDate.Было предложено использовать новый поток, или добавить обработчик, или использовать Async Task, или AIDL для решения моей проблемы.

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

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

С какими проблемами я могу столкнуться при таком подходе?Поток безопасности?Тупик?Я не знаю.

Почему люди продолжают предлагать мне создать новый поток, обработчик, Async Task или Service для решения моей проблемы, когда расширение моего существующего потока для вызова статического метода, кажется, работает нормально?

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

1 Ответ

3 голосов
/ 04 июня 2011

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

Я не уверен, что вы подразумеваете под ", пишет в logcat toвызвать статический plotData (). "Вы должны писать в logcat только для тестирования.Запись в logcat не приводит к вызову какого-либо метода Java.

Если вы вызываете статический метод plotData () в своей Activity, вам нужно быть чрезвычайно осторожным с этим: firstпотому что трудно определить, какой экземпляр действия должен быть вызван оттуда (он может в любой момент уйти от пользователя, завершившего его, или воссоздаться как новый экземпляр при изменении конфигурации и т. д.);и во-вторых, потому что вы не можете дотронуться до иерархии пользовательского интерфейса / представления вашего приложения из фонового потока, не рискуя испортить его состояние (поскольку иерархия представлений однопоточная).

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

(Конечно, если вы используетеSurfaceView, весь смысл этого в том, чтобы позволить рисовать на нем вне основного цикла пользовательского интерфейса, чтобы ваш фоновый поток мог просто рисовать непосредственно на нем при необходимости. По сути, это похоже на написание игры.)

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