Как реализовать хороший глобальный объект Android для передачи данных в режиме реального времени из фонового потока в активность в режиме реального времени без блокировки? - PullRequest
0 голосов
/ 29 мая 2011

@ Джусит предложил использовать глобальный объект для передачи данных из фонового потока в действие, и это сработало.Но сейчас я беспокоюсь о тупике и о том, есть ли хороший способ избежать / предотвратить его.Также я не уверен, что мой выбор String как глобального объекта такой удачный.Вот объяснение того, что я сейчас сделал.

На самом деле глобальный объект - это просто открытая статическая переменная, созданная в Blueterm.java, как показано ниже:

public class BlueTerm extends Activity {
    // a global object I guess
    public static String strData = "";
    // a couple of booleans to control reads/writes
    public static boolean strWrite = false;
    public static boolean strRead = false;
    ...
}

Так что strData, я полагаю, мой глобальныйобъект, созданный и записанный в фоновом потоке следующим образом:

while (BlueSentry.strRead == true);
BlueSentry.strWrite = true;
BlueSentry.strData = BlueSentry.strData + Character.toString(printableB);
BlueSentry.strWrite = false;

Мое намерение состоит в том, чтобы strRead предотвращал перезапись strData, пока моя работа по построению графиков читает его.strWrite не позволяет моей операции построения графиков читать strData, пока она записывается следующим образом:

while (BlueSentry.strWrite == true);
BlueSentry.strRead = true;
String strData = BlueSentry.strData;
BlueSentry.strData = "";
BlueSentry.strRead = false

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

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

Есть предложения по достижению параллелизма здесь без тупика?Я читал о взаимном исключении (семафоры, блокировки, мьютекс), но я не уверен, какой из них мне следует использовать.Также, возможно, мой выбор String в качестве глобального объекта плох, поскольку я хочу передавать данные в режиме реального времени.То есть я не хочу, чтобы поток был заблокирован в ожидании окончания чтения активности.И я не хочу, чтобы активность блокировалась в ожидании завершения записи фонового потока.Могу ли я избавиться от String и внедрить / использовать буфер FIFO вместо этого, нет?

1 Ответ

3 голосов
/ 29 мая 2011

Используйте обработчик (см. http://developer.android.com/reference/android/os/Handler.html) в качестве метода связи, если вы переходите из фонового потока в действие. См. http://www.tutorialforandroid.com/2009/01/using-handler-in-android.html для краткого учебника, но вкратце:

  1. Создайте в своей деятельности обработчик, который принимает значение Character.toString(printableB) в сообщении.
  2. Передайте обработчик фоновому потоку.
  3. Фоновый поток отправляет сообщения обработчику с каждым обновлением.
  4. Обработчик вызывается и вносит необходимые изменения в поток действия.

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

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