Вы не указали код вашего интерфейса Bluetooth. Однако, если это в значительной степени основано на примере BluetoothChat, то существует простая проблема с примером BluetoothChat в его нынешнем виде: в основном, когда read()
сделан из гнезда Bluetooth и помещен в байтовый массив, эта ссылка на массив отправлено в пользовательский интерфейс, используя Handler
, как вы делаете. Фактическая проблема заключается в том, что если пример BluetoothChat используется для получения данных со скоростью, превышающей скорость набора, вы начинаете видеть пропажу или перепутывание символов, потому что последующий read()
перезаписывает массив, в то время как пользовательский интерфейс все еще чтение массива, чтобы извлечь последнюю группу символов, полученных.
Итак, если ваш MESSAGE_WRITE
объект содержит ссылку на массив, в который вы делаете сокет, в который read()
обращается, то, возможно, именно поэтому вы теряете символы. Поэтому попробуйте отправить копию массива, используя Arrays.copyOf()
, в Message
. Или, возможно, есть круговая буферная схема, которую вы могли бы использовать.
У меня была именно эта проблема, когда я использовал пример BluetoothChat в качестве основы для своего проекта. Что я лично сделал, чтобы обойти эту проблему (и устранить необходимость в копировании буферов и т. Д.), Так это реализовать механизм, посредством которого я сообщал бы поток соединения Bluetooth (поток, содержащий сокет блокировки .read()
), с помощью от вызова метода, сколько байтов я ожидаю, что ответ будет (к счастью, протокол, с которым я имею дело, позволяет знать длину ответа). Затем поток соединения отправляет Message
только после получения полного ответа, вместо отправки нескольких Message
с фрагментами ответа в пользовательский интерфейс.