Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 消息处理程序被下一条消息覆盖_Java_Android_Handler - Fatal编程技术网

Java 消息处理程序被下一条消息覆盖

Java 消息处理程序被下一条消息覆盖,java,android,handler,Java,Android,Handler,对编程来说并不陌生,但对Java和Android来说相当陌生。应用程序是蓝牙SPP接收,每秒接收一次短数据包。偶尔蓝牙会给我一部分信息,然后很快就会给我剩下的信息。当这种情况发生时,我的接收线程向我的解析器发送相同类型的消息,但内容不同。然而,解析器从第二条消息接收到的“数据”与第一条消息的“长度”相同 这是我的代码,我想知道我应该做什么来区分消息,或者我是否需要在我的接收方线程中检查消息是否已被处理并休眠几毫秒,然后重试。意见?对不起,我正在通过我看到的例子学习,我确信有几种方法可以完成我在这

对编程来说并不陌生,但对Java和Android来说相当陌生。应用程序是蓝牙SPP接收,每秒接收一次短数据包。偶尔蓝牙会给我一部分信息,然后很快就会给我剩下的信息。当这种情况发生时,我的接收线程向我的解析器发送相同类型的消息,但内容不同。然而,解析器从第二条消息接收到的“数据”与第一条消息的“长度”相同

这是我的代码,我想知道我应该做什么来区分消息,或者我是否需要在我的接收方线程中检查消息是否已被处理并休眠几毫秒,然后重试。意见?对不起,我正在通过我看到的例子学习,我确信有几种方法可以完成我在这里所做的事情

接收人:

protected void receive() {
    byte[] recvBuffer = new byte[128];
    while(inStream != null) {
        try {
            int bytesReceived = inStream.read(recvBuffer);
            System.out.println("BT-In: ");
            String outString = new String(recvBuffer, 0, bytesReceived);
            System.out.println(outString);
            processReceive.obtainMessage(NEW_DEVICE_DATA, bytesReceived, -1, recvBuffer)
                          .sendToTarget();
        }
        catch (IOException e){
            WarningBox("Warning", "Receive over Bluetooth did not work, check connection.");      
            break;
        }
    }
};
处理程序:

Handler processReceive = new Handler() {
@Override
    public void handleMessage(Message msg) {
        switch(msg.what) {
        default:
            break;
        case NEW_DEVICE_DATA:
            byte[] parseInfo = (byte[])msg.obj;
            String outString = new String(parseInfo, 0, msg.arg1);
            System.out.println("Parse-In: ");
            System.out.println(outString);
            //ParseReceivedData(parseInfo);
            break;
        }
    }
};
现在,我不是在解析数据,而是试图验证我是否通过蓝牙从远程设备获取了所有信息,并且我正确地将这些信息发送给解析器,解析器最终将更新我的屏幕字段

我的日志可能如下所示:

英国电信: ABCabc

解析: ABCabc

英国电信: 十二,

英国电信: 3456789

解析: 三十四

解析: 3456789


这里的错误是,我有两个蓝牙接收器彼此靠近,假设整个字符串是“123456789”,但我将其分为两部分“12”和“3456789”,然后我将这两部分发送给我的解析器(主线程),处理程序看到了两条消息,但第一条消息的大小被正确接受,但是内容不正确。

另一端是什么类型的设备?它需要以某种方式构建消息框架,以便您能够识别消息的开始和结束位置(或者在消息开头发送消息长度。是的,它是有帧的,我看到了帧,我引用的数据不是实际的,但经过简化以显示我的问题。解析器负责处理解帧,我的问题是,当我将蓝牙接收到的数据发送给我的处理程序时,我没有逐字地看到它。如果你在想蓝牙有性能问题,我应该一次看到每秒一次30个字符左右的消息,这是另一个话题。我使用了Jerry Li的Bluetooth SPP应用程序,可以很好地看到远程设备的数据。我的蓝牙接收器可以看到所有数据,有时是整个数据包,有时是两个片段。问题是当蓝牙接收到片段1并发送给处理程序时,(处理程序尚未运行),蓝牙接收片段2,发送给处理程序,处理程序运行,它有两条消息,它看到片段1的长度,但在第一条消息中看到片段2的数据,在第二条消息中看到片段2的长度和片段2的数据。我误解了消息处理。