Подключены два устройства с поддержкой Bluetooth.Один отправляет периодическую метку времени (writeTime) через outputStream другому, который извлекает writeTimes через inputStream и присоединяет свои собственные метки времени (readTime) для сравнения.Моя цель - сделать readTime равным writeTime для каждого цикла.Приведенный ниже код заставляет writeTimes увеличиваться с заданной задержкой (3 секунды), но readTimes не увеличивается.Чтение времени фиксируется в тот момент, когда два устройства соединяются друг с другом.Вот фрагменты outputStream.write и inputStream.read вместе с примерами результатов.
Для отправляющего устройства: Цикл в таймере с задержкой в три секунды между записями в outputStream: есть CountDownTimer, управляющий onTick
public void onTick(long millisUntilFinished) {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat mdformat = new SimpleDateFormat("HH:mm:ss");
String thisTime = mdformat.format(calendar.getTime());
tV.setText("Current Time: " + thisTime); // thisTime increments on the display in real time.
try {
thisTime=thisTime+ "^"; // "^" added as the end of a line
outputStream.write(thisTime.getBytes(Charset.forName("UTF-8")));
} catch (IOException e) {}
Для принимающего устройства: цикл чтения (iloop), который повторяет столько же раз, сколько цикл записи от отправителя:
for (iloop =1;iloop<6;iloop++) {
inputStream = socket.getInputStream();
byte[] inbyte = new byte[1];
int inbuffer;
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
writeTime = "";
eol = false;
do {
inbuffer = br.read();
if (inbuffer != 94) { // character "^" (byte 94) triggers an end-of-line for each read.
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeInt(inbuffer);
inbyte = bos.toByteArray();
next = new String(inbyte, "UTF-8");
writeTime = writeTime + next;
} else {eol = true;}
} while (!eol);
readTime = mdformat.format(calendar.getTime());
readarray[iloop] = "\r\n" + writeTime + " " + readTime ;
}
}
Снимок экрана readarray после того, как онзаписано: (цикл из пяти строк с задержкой в 3 секунды между операциями записи):
14:44:12 14:44:02
14:44:15 14:44:02
14:44:18 14:44:02
14:44:21 14:44:02
14:44:24 14:44:02
Вывод: InputStream читается с отметкой времени, равной началу соединения с сокетом.(В примере вывода я подождал десять секунд после подключения, прежде чем приступить к записи в outputStream).Как я могу получить readTime для отражения writeTime?Моей конечной целью является чтение из inputStream с периодической скоростью, а не пакетная обработка большого количества небольших операций чтения в одном пакете.Я хочу получить доступ к каждому чтению в режиме реального времени и знать, когда это произошло.
Обновление этого поста: я получил представление от Ole VV и просто переместил следующие три строки кода из ВНЕШНЕГО цикла чтения (iloop) ВНУТРИ iloop чуть выше readTime
Calendar calendar = Calendar.getInstance();
SimpleDateFormat mdformat = new SimpleDateFormat("HH:mm:ss");
String strDate;
Это решило проблему.Я должен был понять, что календарь является экземпляром Календаря, чья характеристика calendar.getTime () не изменяется с тиканием часов.Устаревший SimpeDateFormat не был виноват, хотя предложение Ole VV заменить его может быть полезно в других приложениях.