블루투스 채팅 예제를 베이스로 사용하고 있는데요
블루투스를 통해서 센서 값을 보내고 받고 있는데요
받는 값을 화면에 띄워주고 있는데 같은 값이 또 나오거나 합쳐져서 나오는 경우가 있습니다.
예를 들어서
60.30186 roll
21.151842 pitch 이렇게 두줄이 나와야 정상인데
-4.431724 pitc
-4.431724 pitch 이나
-1.342653 pit
-1.342653 pitch 또는
-1.342653 p
-1.342653 pitch 이런식으로 나올때가 있습니다.
먼저 구글링을 해봤는데 가장 그럴듯한 설명을 찾아봤는데 아래와 같은 설명입니다.
public void run() {
Log.i(TAG, "BEGIN mConnectedThread");
byte[] buffer = new byte[1024];
int bytes;
// Keep listening to the InputStream while connected
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
connectionLost();
break;
}
}
}
아마도 원흉은 바로 이 구문에 있을 듯 합니다. 데이타를 읽을 때, 공용 buffer 를 사용하고 있거든요.
sendToTarget() 메서드는 Async 스타일에, 메세지 큐에 메세지를 던져 놓고 바로 리턴됩니다.
그리고 해당 메세지는 메세지 큐에 들어간 후,
일정 시간이 지나 자기 차례가 온 순간에야 처리(여기서는 GUI 에 업데이트)됩니다.
그런데 여기서 잠깐...
그전에 소켓 상에서 또다른 read 가 일어나면 어떤 일이 될까요;;;
네... 이전에 날아간 메세지도, 그리고 새롭게 날아갈 메세지도 모두 동일한 buffer 를 참조
하고 있기 때문에, 이전에 전달한 메세지가 아예 유실되거나, 새로운 메세지와 겹쳐져서 출력될
수 있습니다.
- 여기까지 -
이 설명이 맞는지 그리고 이 설명이 맞다면 이 부분의 어디를 어떻게 수정해야 할지 모르겠습니다.
도와주세요 부탁드려요