@ Джусит предложил использовать глобальный объект для передачи данных из фонового потока в действие, и это сработало.Но сейчас я беспокоюсь о тупике и о том, есть ли хороший способ избежать / предотвратить его.Также я не уверен, что мой выбор 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 вместо этого, нет?